三种让线程等待和唤醒的方法: LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程:
第一种方式:synchronized + wait + notify:
即使用Object中的wait方法让线程等待,使用Object中的notify方法唤醒线程:
代码演示:
存在的弊端: 问题一:
报异常,证明 wait + notify不能脱离synchronized 代码块或者方法。
问题二:
被阻塞的结果,证明wait + notify顺序不能颠倒,只能先等待后唤醒。等待中的线程才能被唤醒,否则无法被唤醒
第二种方式:Lock + await + signal :
即使用JUC包中的Condition的await方法让线程等待,使用signal方法唤醒线程:
代码演示:
存在的问题: 出现异常:证明lock和await和signal必须一起使用才行;
问题二:
同样存在问题:线程阻塞不能运行,必须要先等待,后唤醒
总结:传统的synchronized 和Lock实现等待唤醒通知的约束:
第三种方式:LockSupport + park +unpark :
即LockSupport类的park方法可以 阻塞当前线程以及使用unpark 方法唤醒指定被阻塞的线程:
注意:== park相当于wait, unpark相当于notify ==
LockSupport是什么:
park方法:
unpark方法:
代码演示:
先通知后阻塞:
重点:
LockSupport面试题:
|