多執行緒3 執行緒間通訊

2021-08-20 01:12:57 字數 1474 閱讀 2473

- 這兩種方法都要在同步**塊或同步方法中呼叫。

- 都需要先獲得物件級別的鎖。

- 只有兩個方法的物件鎖一致,即「物件監視器」一致,再能通過notify方法通知到執行wait方法的執行緒繼續執行。

- 使用wait方法後,該執行緒會釋放物件鎖,並進入阻塞佇列等待被喚醒。

- notify方法喚醒wait方法後,該執行緒進入就緒佇列,但是要等待notify方法的執行緒將synchronized**塊全部執行完才能釋放物件鎖,使被喚醒的執行緒執行。即執行notify方法後不會立即釋放物件鎖。

- 不能interrupt已經被wait的執行緒,因為該執行緒已經釋放鎖並且進入阻塞佇列了。

- notify一次只能喚醒乙個被阻塞的執行緒。

- 如果存在同乙個「物件監視器」的多個執行緒被wait,那麼nitify的時候是隨機喚醒乙個執行緒。如果要全部喚醒,使用notifyall。

- wait還有帶long型別引數的使用方法。該方法時等待某一時間內是否有執行緒被喚醒,如果沒有,則自動喚醒執行緒。

執行緒a和執行緒b分別呼叫物件c的同步方法x和y,方法x設定wait(5000),方法y設定wait(3000),執行程式。執行緒a在執行方法x的wait 時釋放物件鎖,執行緒a進入阻塞佇列等待被喚醒,執行緒b獲得物件鎖,同樣執行到wait 時釋放物件鎖,執行緒b進入阻塞佇列等待被喚醒。等待3秒後,執行緒b被自動喚醒,執行wait方法之後的**,執行緒跑完之後釋放鎖。程式再等待2秒後(共等待5秒)執行緒a被自動喚醒,其他同上。即程式執行的總時長為5秒。如果將wait替換成sleep,因為同步性,共需8秒。

若此時有乙個notify方法喚醒執行緒,隨機乙個執行緒會被立即喚醒,而其他阻塞佇列中的執行緒需要等待特定時間後才能被自動喚醒或者等待其他notify方法喚醒。

若多個執行緒在設定wait(long)方法後,同時被自動喚醒,則同步執行,即排隊執行,順序隨機。

即執行緒還沒有執行wait方法進入阻塞佇列就被notify方法去喚醒。

多執行緒中的判斷條件,使用if會出錯,建議使用while。

原因:wait的執行緒在被喚醒之後,會從wait語句之後繼續執行。使用if就不會在判斷條件,使用while還會再去判斷。

當主線程呼叫其他執行緒進行運算等操作時,若需要等待該執行緒的結果返回後才繼續主線程之後的操作,就需要用到join方法。

在主線程中呼叫執行緒b的join()方法,主線程中join方法之後的模組將等待執行緒b執行完之後才會執行。

join原理是⑩主線程進入阻塞狀態,等待其他執行緒執行完銷毀後喚醒。

- join類似在內部使用了wait方法,當執行緒銷毀後又喚醒。

- synchronized使用的是物件監視器原理,即鎖機制。

join方法底層是使用wait方法實現的,所以具有釋放鎖的特點,而sleep不會釋放鎖。

threadlocal保證了各自執行緒之間私有資料的隔離性。

使子執行緒可以從父執行緒中取得值。

注意:如果子執行緒取得值的同時,父執行緒改變該值,則子執行緒中的值任然是舊值。

多執行緒 執行緒間通訊

wait 方法的作用是使當前執行的執行緒進入等待,執行到 wait 一行進入等待 當執行緒被喚醒時從 wait 下一行開始執行。wait 方法需要在 synchronized 塊中呼叫,否則會報錯。wait 方法會釋放鎖,其它執行緒可以競爭獲得鎖 wait 方法有乙個帶時間引數的,當時間到了可以自動...

多執行緒 執行緒間通訊

學習思路 執行緒同步 鎖 wait notify join threadlocal 通過管道輸入 輸出流 字元流 位元組流 服務如果一直處於單執行緒訪問,那將毫無意義,多使用者訪問必然產生多執行緒,而多執行緒訪問必然離不開執行緒間通訊 多執行緒操作共享資源時勢必會產生執行緒安全的問題 也就是我們說的...

142 多執行緒 執行緒間通訊

執行緒間通訊 其實就是多執行緒在操作同乙個資源。但是操作的動作不同 class res class input implements runnable public void run else x x 1 2 class output implements runnable public void ...