
三种让线程等待和唤醒的方法:  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面试题:
 

|