从化做网站,广州网站建设支付,成都网站建设外包,推广外包1、小故事 - 为什么需要 wait 由于条件不满足#xff08;没烟干不了活啊#xff0c;等小M把烟送过来#xff09;#xff0c;小南不能继续进行计算 但小南如果一直占用着锁#xff0c;其它人就得一直阻塞#xff0c;效率太低 于是老王单开了一间休息室#xff08;调…1、小故事 - 为什么需要 wait 由于条件不满足没烟干不了活啊等小M把烟送过来小南不能继续进行计算 但小南如果一直占用着锁其它人就得一直阻塞效率太低 于是老王单开了一间休息室调用 wait 方法让小南到休息室WaitSet等着去了但这时锁释放开其它人可以由老王随机安排进屋 直到小M将烟送来大叫一声 [ 你的烟到了 ] 调用 notify 方法 小南于是可以离开休息室重新进入竞争锁的队列
2、wait notify 原理 Owner 线程发现条件不满足调用 wait 方法即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 WAITING 的线程都处于阻塞状态不占用 CPU 时间片 BLOCKED 线程会在 Owner 线程释放锁时唤醒 WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒但唤醒后并不意味者立刻获得锁仍需进入 EntryList 重新竞争
3、API 介绍 obj.wait() 让进入 object 监视器的线程到 waitSet 等待 obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒 obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒
它们都是线程之间进行协作的手段都属于 Object 对象的方法。必须获得此对象的锁才能调用这几个方法否则会报IllegalMonitorStateException
final static Object obj new Object();
public static void main(String[] args) {
new Thread(() - {synchronized (obj) {log.debug(执行....);try {obj.wait(); // 让线程在obj上一直等待下去} catch (InterruptedException e) {e.printStackTrace();}log.debug(其它代码....);}}).start();
new Thread(() - {synchronized (obj) {log.debug(执行....);try {obj.wait(); // 让线程在obj上一直等待下去} catch (InterruptedException e) {e.printStackTrace();}log.debug(其它代码....);}}).start();
// 主线程两秒后执行sleep(2);log.debug(唤醒 obj 上其它线程);synchronized (obj) {obj.notify(); // 唤醒obj上随机一个线程// obj.notifyAll(); // 唤醒obj上所有等待线程}
}
notify 的一种结果
20:00:53.096 [Thread-0] c.TestWaitNotify - 执行....
20:00:53.099 [Thread-1] c.TestWaitNotify - 执行....
20:00:55.096 [main] c.TestWaitNotify - 唤醒 obj 上其它线程
20:00:55.096 [Thread-0] c.TestWaitNotify - 其它代码....
notifyAll 的结果
19:58:15.457 [Thread-0] c.TestWaitNotify - 执行....
19:58:15.460 [Thread-1] c.TestWaitNotify - 执行....
19:58:17.456 [main] c.TestWaitNotify - 唤醒 obj 上其它线程
19:58:17.456 [Thread-1] c.TestWaitNotify - 其它代码....
19:58:17.456 [Thread-0] c.TestWaitNotify - 其它代码....
wait() 方法会释放对象的锁进入 WaitSet 等待区从而让其他线程就机会获取对象的锁。无限制等待直到 notify 为止
wait(long n) 有时限的等待, 到 n 毫秒后结束等待或是被 notify