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

Java多線程系列---“基礎篇”14之 wait,sleep,join,yield,park,unpark,notify等通信機制對比

不可 sleep 可能 優先級 sta 共享 時間 pan 基礎

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方法, 才可以中斷剛才的阻塞而繼續去執行線程.

Java多線程系列---“基礎篇”14之 wait,sleep,join,yield,park,unpark,notify等通信機制對比