zoukankan      html  css  js  c++  java
  • 【Java】多线程学习——wait、notify和notifyAll

        Java多线程非常复杂,可以使用BlockingQueue和Executor等工具类来简化使用。但还是要弄清wait()、notify()和notifyAll()的作用和用法。它们都是Object类中的native方法。

    一、wait()

      作用:告诉当前调用它的方法释放锁并sleep,直到其它某个线程也进入sleep状态且调用notify()方法。

      注意:该线程在进入waiting之前释放锁,并在wait()方法返回之前重新获取锁。也就是说wait()方法调用之后线程释放锁,然后进入waiting状态。

        一直到其它的线程调用notify方法,并轮到本线程的时候,wait方法才返回。

      示例:    

    synchronized(lockObj){
        while(!condition){
            lockObj.wait();
        }     
        //其它代码   
    }

    二、notify()

      作用:唤醒在同一锁对象上的一个线程。

      注意:调用notify()并不立即释放锁。它只是告诉某个正在等待的线程可以被唤醒,当同步快的所有代码执行完之后,锁才会被真正释放。

      示例:

    synchronized(lockObj)
    { 
        //建立条件
    
        lockObject.notify();   
      
        //其他需要被执行的代码
    }

    三、notifyAll()

      与notify()方法的区别是:它唤醒所有在同一锁对象的所有线程。大部分情况下,最高优先级的线程将先运行,但并不保证这一点。

    四、用法

      一般的用法如上述的示例即等待-通知机制,套路如下:

      1、Thread1中判断某一条件不成立while(!condition),然后调用wait()方法。

      2、Thread2中建立该条件如condition=true,然后调用notify()。

  • 相关阅读:
    redis发布订阅
    redis学习笔记(面试题)
    redis安全 (error) NOAUTH Authentication required
    HDU3001 Travelling —— 状压DP(三进制)
    POJ3616 Milking Time —— DP
    POJ3186 Treats for the Cows —— DP
    HDU1074 Doing Homework —— 状压DP
    POJ1661 Help Jimmy —— DP
    HDU1260 Tickets —— DP
    HDU1176 免费馅饼 —— DP
  • 原文地址:https://www.cnblogs.com/tigerhsu/p/10857000.html
Copyright © 2011-2022 走看看