
💐个人主页:初晴~
我们都知道,线程在系统调度上是随机的,因此线程之间执⾏的先后顺序难以预知。但在实际开发中有时我们希望控制多个线程执行某个逻辑的先后顺序,就可以让后执行的逻辑使用wait,先执行的线程完成某些逻辑后,再通过notify唤醒对应的线程,从而使多个线程以一定的顺序运行。那么本篇文章就让我们深入地去探讨wait与notify的特点与应用吧
目录
一、wait()
wait 做的事情:
- 使当前执⾏代码的线程进⾏等待. (把线程放到等待队列中)
- 释放当前的锁
- 满⾜⼀定条件时被唤醒, 重新尝试获取这个锁.
注意:
wait 要搭配 synchronized 来使⽤. 脱离 synchronized 使⽤ wait 会直接抛出异常
我们发现抛出了一个
“IllegalMonitorStateException”异常
,
大致意思就是“非法的锁状态异常”。就是说调用wait时,当前锁的状态是非法的(不正常的)。因为调用wait()后,会进行一个针对locker对象先解锁的操作,所以,必须要在synchronized代码块中,才能够使用wait(),因为显然要先上锁,才能够正常地解锁
wait 结束等待的条件:
• 其他线程调⽤该对象的 notify ⽅法告诉该对象不用再等了.• wait 等待时间超时 (wait ⽅法提供⼀个带有 timeout 参数的版本, 来指定等待时间).• 其他线程调⽤该等待线程的 interrupted ⽅法, 导致 wait 抛出 InterruptedException 异常.
wait()应用示例:
public class Main {
public static void main(String[] args) throws InterruptedException {
Object locker=new Object();
synchronized (locker){
System.out.println("wait 之前");
locker.wait();
System.out.println("wait 之后");
}
}
}

这时main线程就会进入阻塞等待的状态,等待其它线程的唤醒。
我们可以通过jconsole来观察到此时main线程的状态:

最低0.47元/天 解锁文章
1675





