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