Thread 的sleep、wait、yield、interrupt

許佳佳233發表於2017-03-22

sleep:

在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行),此操作受到系統計時器和排程程式精度和準確性的影響。該執行緒不丟失任何監視器的所屬權。
通過呼叫sleep使任務進入休眠狀態,在這種情況下,任務在指定的時間內不會執行。
呼叫sleep的時候鎖並沒有被釋放。
休眠
Java SE5引入了更加顯示的sleep()版本作為TimeUnit類的一部分,這個方法允許你指定sleep()延遲的時間單元,因此可以提供更好的可閱讀性。TimeUnit還可以被用來執行轉換,就想稍後你會在本書中看到的那樣。

wait:

呼叫wait使執行緒掛起,知道執行緒得到了notify或notifyAll訊息,執行緒才會進入就緒狀態。
使你可以等待某個條件發生變化,而改變這個條件超出了當前方法的控制能力。
執行緒的執行被掛起,物件上的鎖被釋放。意味著另一個任務可以獲得這個鎖。因此在改物件中的其他synchronized方法可以在wait期間被呼叫。
就意味著生命“我已經剛剛做完能做的所有事情,因此我要在這裡等待,但是我希望其他synchronized操作在條件適合的情況下才能夠執行”

yield:

如果知道已經完成了在run()方法的迴圈的一次迭代過程中所需要的工作,就可以給執行緒排程一個機制暗示:我的工作已經做的差不多了,可以讓給別的執行緒使用CPU了。通過呼叫yield()來實現。
當呼叫yield時,你也是在建議具有相同優先順序的其他執行緒可以執行。
對於任何重要的控制或在調整應用時,都不恩那個依賴於yield。實際上,yield經常被誤用。
(yield並不意味著退出和暫停,只是,告訴執行緒排程如果有人需要,可以先拿去,我過會再執行,沒人需要,我繼續執行)
呼叫yield的時候鎖並沒有被釋放。

interrupt:

中斷執行緒。
Thread.interrupt()或者新類庫裡面通過Executor的submit()來獲得Future返回值,這個Future提供cancel()以停止這個執行緒。
Thread類包含interrupt()方法,因此你可以終於被阻塞的任務,這個方法將設定執行緒的中斷狀態。如果一個執行緒已經被阻塞,或者檢視執行一個阻塞操作,那麼設定這個執行緒的終端狀態將丟擲InterruptedException。當丟擲該異常或者該任何呼叫Thread.interrupted()時,中斷狀態將復位。
你在Executor上呼叫shutdownNow(),那麼它將傳送一個interrupt()呼叫給他啟動的所有執行緒。

相關文章