2019-10-17
sleep
sleep()是線程線程類(Thread)的方法,調(diào)用會(huì)暫停此線程指定的時(shí)間可都,但監(jiān)控依然保持耕姊,不會(huì)釋放對(duì)象鎖,到時(shí)間自動(dòng)恢復(fù)棍丐;
wait
wait()是Object的方法误辑,調(diào)用會(huì)放棄對(duì)象鎖,進(jìn)入等待隊(duì)列歌逢,待調(diào)用notify()/notifyAll()喚醒指定的線程或者所有線程巾钉,才會(huì)進(jìn)入鎖池,不再次獲得對(duì)象鎖才會(huì)進(jìn)入運(yùn)行狀態(tài)
notifyAll調(diào)用后秘案,會(huì)將全部線程由等待池移到鎖池砰苍,然后參與鎖的競(jìng)爭(zhēng),競(jìng)爭(zhēng)成功則繼續(xù)執(zhí)行阱高,如果不成功則留在鎖池等待鎖被釋放后再次參與競(jìng)爭(zhēng)赚导。而notify只會(huì)喚醒一個(gè)線程
uasge
永遠(yuǎn)在synchronized的函數(shù)或?qū)ο罄锸褂脀ait、notify和notifyAll赤惊,不然Java虛擬機(jī)會(huì)生成 IllegalMonitorStateException吼旧。
永遠(yuǎn)在while循環(huán)里而不是if語(yǔ)句下使用wait。這樣未舟,循環(huán)會(huì)在線程睡眠前后都檢查wait的條件圈暗,并在條件實(shí)際上并未改變的情況下處理喚醒通知。
永遠(yuǎn)在多線程間共享的對(duì)象(在生產(chǎn)者消費(fèi)者模型里即緩沖區(qū)隊(duì)列)上使用wait处面。
更傾向用 notifyAll()厂置,而不是 notify()。
kill
使用Thread提供的interrupt()方法魂角,因?yàn)樵摲椒m然不會(huì)中斷一個(gè)正在運(yùn)行的線程昵济,但是它可以使一個(gè)被阻塞的線程拋出一個(gè)中斷異常,從而使線程提前結(jié)束阻塞狀態(tài)野揪,退出堵塞代碼
通信
進(jìn)程通信
- 管道
- 消息隊(duì)列
- 共享內(nèi)存
- 發(fā)信號(hào)
- 信號(hào)量
- 套接字
線程通信
- 鎖
- 信號(hào)量
- signal
- 全局變量共享
- 阻塞喚醒