wait,notify,sleep,yield,join,interrupt,isInterrupted 方法總結

java 多線程相關方法總結(wait,notify,sleep,yield,join,interrupt,isInterrupted ,synchronized 代碼塊和方法)

java 中 object 對象的隱藏屬性——monitor 和 wait set.

java中 任何一個對象 都有以上兩個涉及到 多線程併發 方面的隱藏屬性。監視器 和 等待隊列。 



有些方法執行時,需要擁有對象的鎖。
wait,notify 這類方法執行時,必須擁有對象的鎖。

因爲他們涉及到 釋放鎖的操作。

獲取對象鎖的方法————————synchronized 代碼塊和方法
synchronized 代碼塊 :鎖對象自己設置。
synchronized方法 : 實例方法 ————鎖對象是實例。(Thread.join()使用的所對象 就是 thread objcet) 
                                    靜態方法————所對象是 類實例。

wait方法, 當前線程暫停執行, 釋放掉 其獲取的對象的 monitor.並將當前線程插入到 waitset 等待隊列中,由於需要釋放鎖。所以該方法執行時,必須先擁有
鎖,也就是 該方法必須在synchronized 代碼塊和方法 中進行調用。
notify.  當前線程 喚醒 對象等待線程中的一個 線程 繼續執行。當然 改方法不會暫停執行,會一直執行完,然後再釋放自己獲得的鎖。(如果不釋放鎖,喚醒的線程 也無法繼續執行,因爲喚醒線程必須在同步塊或方法中執行。)該方法必須在synchronized 代碼塊和方法 中進行調用。

notify 和wait ,可以進行線程間的通信,也可以用來實現一些 線程池機制。

sleep: sleep 是 當前線程睡一段時間,放棄當前執行權限,cpu會調度其他線程執行,如果超過設定的時間,該線程會自動醒來,從新參與cpu調度。不涉及鎖。

yield:  yield跟sleep方法類似,區別是yield不設置時間,只是放棄當前執行權限,立刻從新參與cpu的調度,很可能立刻又從新獲取了執行機會。

join:  join是 強行讓當前線程等待,執行join進來的線程。直到join進來的線程執行完畢,或者是經執行時間已經超過設置的時間,在繼續當前線程的執行。
join 是 利用 wait() 來執行邏輯的。 同步的對象是 thread object.  jvm 會在 thread 的run 運行完後,設置 thread object.inAlive() 爲false.
同時 會調用 thread Object.notify(). 這也就是 爲什麼 ,子線程運行完後, join會自動返回的原因。

interrupt: 該方法 設置 線程的interrupt flag 爲true. wait,或 sleep方法會檢查該flag. 如果爲true.這類方法會拋出 InterruptedException

如何 檢查 該flag? Thread.isInterrupted ()返回當前線程的 interrupt flag. 並將該flag 置爲 false.
new Thread().isInterrupted() 返回new Thread()的 interrupt flag. 不會重置flag .

方法所在的類
wait(),notify() 在 java.lang.Object
其他在 java.lang.Thread

實例方法(wait(),notify(),join(),interrupt(),isInterrupted)  靜態方法(sleep,yield,isInterrupted)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章