1. 程式人生 > >Java多執行緒系列---“基礎篇”14之 wait,sleep,join,yield,park,unpark,notify等通訊機制對比

Java多執行緒系列---“基礎篇”14之 wait,sleep,join,yield,park,unpark,notify等通訊機制對比

1. 執行緒讓步: yield()

yield()的作用是讓步。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行!

2. yield() 與 wait()的比較

我們知道,wait()的作用是讓當前執行緒由“執行狀態”進入“等待(阻塞)狀態”的同時,也會釋放同步鎖。而yield()的作用是讓步,它也會讓當前執行緒離開“執行狀態”。它們的區別是:
(1) wait()是讓執行緒由“執行狀態”進入到“等待(阻塞)狀態”,而不yield()是讓執行緒由“執行狀態”進入到“就緒狀態”。
(2) wait()是會執行緒釋放它所持有物件的同步鎖,而yield()方法不會釋放鎖。

3. 執行緒休眠:sleep()
sleep() 定義在Thread.java中。
sleep() 的作用是讓當前執行緒休眠,即當前執行緒會從“執行狀態”進入到“休眠(阻塞)狀態”。sleep()會指定休眠時間,執行緒休眠的時間會大於/等於該休眠時間;線上程重新被喚醒時,它會由“阻塞狀態”變成“就緒狀態”,從而等待cpu的排程執行。

4. sleep() 與 wait()的比較:
我們知道,wait()的作用是讓當前執行緒由“執行狀態”進入“等待(阻塞)狀態”的同時,也會釋放同步鎖。而sleep()的作用是也是讓當前執行緒由“執行狀態”進入到“休眠(阻塞)狀態”
但是,wait()會釋放物件的同步鎖,而sleep()則不會釋放鎖。

5. sleep()與yield()的比較:

sleep和yield的區別在於, sleep可以使優先順序低的執行緒得到執行的機會,  而yield只能使同優先順序的執行緒有執行的機會.

6. Object中的wait()和notify()
使用注意事項:

  • 因為wait需釋放鎖,所以必須在synchronized中使用(沒有鎖時使用會丟擲IllegalMonitorStateException)
  • notify也要在synchronized使用,並且應該指定物件
  • synchronized(),wait(),notify() 物件必須一致,一個synchronized()程式碼塊中只能有1個執行緒wait()或notify()

7.LockSupport中的park() 和 unpark()

      總結一下,LockSupport比Object的wait/notify有兩大優勢:

   ①LockSupport不需要在同步程式碼塊裡 。所以執行緒間也不需要維護一個共享的同步物件了,實現了執行緒間的解耦。說明:park和wait的區別。wait讓執行緒阻塞前,必須通過synchronized獲

       取 同步鎖。

   ②unpark函式可以先於park呼叫,所以不需要擔心執行緒間的執行的先後順序。

8.join

等待該執行緒終止。
等待呼叫join方法的執行緒結束,再繼續執行。如:t.join();//主要用於等待t執行緒執行結束,若無此句,main則會執行完畢,導致結果不可預測。

9.interrupt

 interrupt方法不會中斷一個正在執行的執行緒.就是指執行緒如果正在執行的過程中, 去呼叫此方法是沒有任何反應的. 為什麼呢, 因為這個方法只是提供給 被阻塞的執行緒, 即當執行緒呼叫了.Object.wait, Thread.join, Thread.sleep三種方法之一的時候, 再呼叫interrupt方法, 才可以中斷剛才的阻塞而繼續去執行執行緒.