sleep
- api文檔
在指定的毫秒數(shù)內(nèi)**讓當(dāng)前正在執(zhí)行的線(xiàn)程休眠**(暫停執(zhí)行)啊终,此操作受到系統(tǒng)計(jì)時(shí)器和調(diào)度程序精度和準(zhǔn)確性的影響。該線(xiàn)程不丟失任何監(jiān)視器的所屬權(quán)傲须。
-
理解
- Thread類(lèi)的靜態(tài)方法蓝牲。休眠時(shí),僅僅釋放CPU資源泰讽,不會(huì)釋放同步鎖搞旭,可被中斷。
- InterruptedException:當(dāng)前線(xiàn)程被中斷是拋出此異常菇绵,需捕獲處理。
yield
- Thread類(lèi)的靜態(tài)方法镇眷。
- Yield是一個(gè)靜態(tài)的原生(native)方法咬最。
- Yield告訴當(dāng)前正在執(zhí)行的線(xiàn)程把運(yùn)行機(jī)會(huì)交給線(xiàn)程池中優(yōu)先級(jí)高的線(xiàn)程。
- 它僅能使一個(gè)線(xiàn)程從運(yùn)行狀態(tài)轉(zhuǎn)到可運(yùn)行狀態(tài)欠动,而不是等待或阻塞狀態(tài)永乌。
- 誰(shuí)能獲得CPU完全取決于調(diào)度器惑申,在有些情況下調(diào)用yield方法的線(xiàn)程甚至?xí)俅蔚玫紺PU資源。所以翅雏,依賴(lài)于yield方法是不可靠的圈驼,它只能盡力而為。參考
join
線(xiàn)程實(shí)例的方法join()方法可以使得一個(gè)線(xiàn)程在另一個(gè)線(xiàn)程結(jié)束后再執(zhí)行望几。如果join()方法在一個(gè)線(xiàn)程實(shí)例上調(diào)用绩脆,當(dāng)前運(yùn)行著的線(xiàn)程將阻塞直到這個(gè)線(xiàn)程實(shí)例完成了執(zhí)行。
wait 橄抹、notify 靴迫、 notifyAll
這三個(gè)方法是Object的final方法÷ナ模可以用 wait玉锌、notify 和 notifyAll 來(lái)實(shí)現(xiàn)線(xiàn)程間的通信。
調(diào)用對(duì)象的wait方法疟羹,該線(xiàn)程就會(huì)處于該對(duì)象的等待池中主守,并釋放鎖。
當(dāng)其它線(xiàn)程調(diào)用該對(duì)象的notifyAll()方法(喚醒所有wait線(xiàn)程)或notify()方法(只隨機(jī)喚醒一個(gè)wait線(xiàn)程)榄融,被喚醒的的線(xiàn)程便會(huì)進(jìn)入該對(duì)象的鎖池中参淫,鎖池中的線(xiàn)程會(huì)去競(jìng)爭(zhēng)該對(duì)象鎖。
只能在同步函數(shù)或代碼塊中使用wait剃袍、notify和notifyAll黄刚,不然Java虛擬機(jī)會(huì)生成 IllegalMonitorStateException。
永遠(yuǎn)在while循環(huán)里而不是if語(yǔ)句下使用wait民效。這樣憔维,循環(huán)會(huì)在線(xiàn)程睡眠前后都檢查wait的條件,并在條件實(shí)際上并未改變的情況下處理喚醒通知畏邢。
永遠(yuǎn)在多線(xiàn)程間共享的對(duì)象(在生產(chǎn)者消費(fèi)者模型里即緩沖區(qū)隊(duì)列)上使用wait业扒。
sleep vs wait
- wait()是用于線(xiàn)程間通信的,而sleep()是用于短時(shí)間暫停當(dāng)前線(xiàn)程舒萎。
- 進(jìn)入wait狀態(tài)的線(xiàn)程能夠被notify和notifyAll線(xiàn)程喚醒程储,并且會(huì)釋放實(shí)例對(duì)象所持有的鎖。sleep不會(huì)被喚醒臂寝,也不會(huì)釋放鎖章鲤。
- Java中的wait方法應(yīng)在同步代碼塊中調(diào)用,sleep則沒(méi)要求咆贬。
寫(xiě)在最后败徊,以上內(nèi)容源于網(wǎng)絡(luò)及個(gè)人總結(jié),若有錯(cuò)誤之處掏缎,請(qǐng)?jiān)u論區(qū)留言討論皱蹦,共勉之煤杀。