摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時間后,進入就緒狀態(tài)。這兩個都能被方法中斷當前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務方獲取鎖改變條件通知為什么是而不是會一直循環(huán),直到條件滿足。
sleep和wait
sleep是Thread類的方法,wait是Object的方法。
sleep可以到處使用,wait必須是在同步方法或者代碼塊里使用,不然會有java.lang.IllegalMonitorStateException異常。
sleep不釋放持有的鎖,wait釋放鎖。wait在調(diào)用方法前,必須持有鎖,調(diào)用notify,notifyall喚醒,也要持有鎖。
sleep休眠一定時間后,進入就緒狀態(tài)。wait由notify和notifyall喚醒。這兩個都能被interrupt方法中斷當前狀態(tài)。
join和yield這兩個和sleep一樣,不釋放持有的鎖。
示例public class WaitDemo { private String tv = "廣告"; static class Tv extends Thread { WaitDemo waitDemo; public Tv(WaitDemo waitDemo) { this.waitDemo = waitDemo; } @Override public void run() { waitDemo.waitTv(); } } public synchronized void waitTv() { while (tv.equals("廣告")) { try { wait(); if (tv.equals("廣告")) { System.out.println(Thread.currentThread().getName() + "-" + "騙人,還是廣告"); } } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + "-" +"愉快的追劇"); } public synchronized void sendTrueMsg() { tv = "正劇"; notifyAll(); } public synchronized void sendFalseMsg() { notifyAll(); } public static void main(String[] args) throws InterruptedException { WaitDemo waitDemo = new WaitDemo(); Tv tv1 = new Tv(waitDemo); Tv tv2 = new Tv(waitDemo); tv1.start(); tv2.start(); Thread.sleep(100); waitDemo.sendFalseMsg(); Thread.sleep(100); waitDemo.sendTrueMsg(); } }
運行的結(jié)果如下:
例子:大部分人喜歡看連續(xù)劇,但是不看廣告(沒錢買VIP),于是就讓別人提醒她廣告結(jié)束了沒有,如果結(jié)束了,就提醒她。
用法:
獲取鎖
while判斷條件,不滿足繼續(xù)wait
滿足執(zhí)行其他業(yè)務
notify方獲取鎖
改變條件
通知
為什么是while而不是ifwhile會一直循環(huán),直到條件滿足。如果是if,只會判斷一次,如果不滿足條件,會一直等待
為什么是notifyAll而不是notify可以把上面的例子,改成notify,那么進程永遠不會結(jié)束,因為在多線程情況下,notify只能喚醒隨機的一個休眠線程,其他已休眠的線程不能喚醒,造成信號不能傳達而丟失,而notifyAll可以喚醒所有的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75252.html
摘要:如果有其它線程調(diào)用了相同對象的方法,那么處于該對象的等待池中的線程就會全部進入該對象的鎖池中,從新爭奪鎖的擁有權(quán)。 wait,notify 和 notifyAll,這些在多線程中被經(jīng)常用到的保留關(guān)鍵字,在實際開發(fā)的時候很多時候卻并沒有被大家重視,而本文則是對這些關(guān)鍵字的使用進行描述。 存在即合理 在java中,每個對象都有兩個池,鎖池(monitor)和等待池(waitset),每個...
摘要:和是配套使用的,方法容易導致死鎖。方法不會保證線程的資源正常釋放方法給線程打個停止標記,將線程的中斷狀態(tài)設置為,并沒有馬上強制中斷線程,線程是否中斷由線程自己決定。終結(jié)狀態(tài),還是返回。方法判斷當前線程是否中斷,清除中斷標志。 resume、suspend、stop resume和suspend是配套使用的,suspend方法容易導致死鎖。 stop方法不會保證線程的資源正常釋放 i...
摘要:限期阻塞調(diào)用方法等待時間結(jié)束或線程執(zhí)行完畢。終止狀態(tài)線程執(zhí)行完畢或出現(xiàn)異常退了。和都會檢查線程何時中斷,并且在發(fā)現(xiàn)中斷時提前放回。工廠方法將線程池的最大大小設置為,而將基本大小設置為,并將超時大小設置為分鐘。 wait()、notify()、notifyAll() Object是所有類的基類,它有5個方法組成了等待、通知機制的核心:notify()、notifyAll()、wait()...
摘要:就緒狀態(tài)調(diào)用或者由阻塞狀態(tài)被解除時,進入就緒狀態(tài),此時,只能表示線程可以運行了,但不代表已經(jīng)運行了,需要等待的調(diào)度。死亡狀態(tài)當線程執(zhí)行結(jié)束或者異常等,線程就會結(jié)束,進入死亡狀態(tài)。 流程圖 showImg(https://segmentfault.com/img/bVbuJ6f); 新建狀態(tài) 當用new創(chuàng)建一個線程后,線程就處于新建狀態(tài),此時和其他普通java對象一樣,由JVM創(chuàng)建內(nèi)存空...
摘要:運行可運行狀態(tài)的線程獲得了時間片,執(zhí)行程序代碼。阻塞的情況分三種一等待阻塞運行的線程執(zhí)行方法,會把該線程放入等待隊列中。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復生。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關(guān)鍵字(1) java多線程學習(二)synchronized關(guān)鍵...
閱讀 1376·2021-11-15 18:11
閱讀 2508·2021-08-19 10:56
閱讀 669·2021-08-09 13:42
閱讀 785·2019-08-30 15:53
閱讀 2078·2019-08-30 10:55
閱讀 3137·2019-08-29 17:18
閱讀 1426·2019-08-29 13:45
閱讀 537·2019-08-29 13:15