Java多线程学习——waitnotify和notifyAll

Posted tigerhsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程学习——waitnotify和notifyAll相关的知识,希望对你有一定的参考价值。

    Java多线程非常复杂,可以使用BlockingQueue和Executor等工具类来简化使用。但还是要弄清wait()、notify()和notifyAll()的作用和用法。它们都是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()。

以上是关于Java多线程学习——waitnotify和notifyAll的主要内容,如果未能解决你的问题,请参考以下文章

3.多线程学习笔记之共享模型之管程

3.多线程学习笔记之共享模型之管程

java多线程笔记--生产者消费组模型

waitnotify应用场景(生产者-消费者模式)

Java Thread waitnotify与notifyAll

怎么用waitnotify巧妙的设计一个Future模式?