Object的wait()和notify()以及notifyAll()和interrupt()方法

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Object的wait()和notify()以及notifyAll()和interrupt()方法相关的知识,希望对你有一定的参考价值。

概述

多线程之间想要互相通信来协作的话,比如A线程在做完一些事情后需要等待B线程一个通知才能继续。这个时候就需要wait()notify()方法了。

顾名思义,wait就是等待,notify就是唤醒,notifyAll则是唤醒所有,interrupt是中断wait状态的线程。

在当前线程中调用对象的wait方法会使得当前线程进入等待。直到该对象的notify方法被调用。来个demo说明一下。

注意点:在调用wait()notify()之前,线程必须获得该对象的锁,因此只能在同步方法/同步代码块中调用wait()notify()方法。

Object lock = new Object();

new Thread(() -> 

    try 
        System.out.println("开始wait" + LocalDateTime.now());


        synchronized (lock)
            lock.wait();
        

     catch (InterruptedException e) 
        e.printStackTrace();
    

).start();

new Thread(() -> 
    try 
        Thread.sleep(3000);
     catch (InterruptedException e) 
        e.printStackTrace();
    
    System.out.println("3秒后唤醒" + LocalDateTime.now());
    synchronized (lock)
        lock.notify();
    

).start();

notifyAll()

经过上面的demo叙述可以知道,其实wait()方法就是让该线程的方法释放共享资源的锁,然后自己进入等待队列中,直到被再次唤醒。

notify()方法则是随机唤醒等待队列中等待同一共享资源的一个线程,并使得该线程退出等待状态,进入可运行状态。

那么notifyAll()方法就是让所有正在等待队列中等待同一共享资源的全部线程从等待状态退出,进入可运行状态。

如果wait()方法和notify()/notifyAll()方法不在同步方法/同步代码块中被调用,那么虚拟机会抛出java.lang.IllegalMonitorStateException

以上是关于Object的wait()和notify()以及notifyAll()和interrupt()方法的主要内容,如果未能解决你的问题,请参考以下文章

Lock的await/singal 和 Object的wait/notify 的区别

object的wait()notify()notifyAll()方法和Condition的await()signal()方法

Object.wait()与Object.notify()的用法

为什么wait()和notify()属于Object类

为啥在 Java 的 Object 类中声明 wait() 和 notify()?

wait和notify方法的使用