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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值