Java併發(4) 執行緒的協作

2021-06-19 14:46:32 字數 926 閱讀 9403

很多時候,乙個執行緒並不能獨自完成乙個完整的任務,執行緒之間進行協作是很常見的。在協作的時候,乙個執行緒可能需要等待乙個條件為真時才能(再次)開始工作。這個時候,使用while進行忙等待是可以實現功能的,但是其效率存在著很大的問題:畢竟cpu時間片讓這些忙等待白白浪費了。這個時候,就需要用到object的wait(),notify()和notifyall()這幾個方法:

wait():當前執行緒被掛起,暫時停止繼續執行,釋放所持有的鎖

notify():喚醒當前鎖物件的等待佇列中的乙個執行緒,如果條件滿足,這個執行緒將會得到執行。

notifyall():喚醒當前鎖物件的等待佇列中的所有執行緒,最終只有乙個執行緒會得到執行。

wait()方法的典型使用模式如下:

123

4567

object

lock

=new

object

();synchronized

(lock

)//正常的業務邏輯

}

值得提醒的是,這三個方法必須在同步方法或者同步塊中,因為執行的前提就是當前執行緒持有鎖。如果違反了這條規則,將會丟擲乙個illegalmonitorstateexception異常。

有乙個很合適的生活中得例子可以用來模擬這種執行緒間得協作方法。

比如有老胡,老溫,老習要到圖書館借同一本書:《**在想什麼》。而恰恰圖書館只有一本這樣的書了。於是被先到的老胡給借到了。於是等老溫和老習來借的時候,他們兩老就會碰壁。現在他們有兩種做法:1.每天來圖書館問老胡有沒有把書給還掉(忙等待)。2.在家等圖書館發出老胡已經把書還掉的通知。顯然,第二種做法優於第一種做法。而圖書館發通知也有兩種做法:1.只通知老溫和老習中的乙個人(notify())。2.同時通知老溫和老習,誰先到誰就先借(notifyall())。

Java併發程式設計學習 3 執行緒間協作

目錄頁 t.join 方法阻塞呼叫此方法的執行緒 calling thread 直到執行緒t完成,此執行緒再繼續 直接上 package com.concurrent.coline.part3.join 類說明 join方法的使用 public class usejoin override publ...

Linux併發(多執行緒協作)

乙個程式裡的執行緒數,就像一家公司裡的員工數一樣,太少了忙不過來,太多了入不敷出。因此我們需要有更好的機制來協調它們。拓展 最理想的情況是 讓程序有一些初始數目的執行緒 所謂的執行緒池 當沒有任務的時候這些執行緒自動進入睡眠,有了任務他們會立即執行任務,不斷迴圈。程序還應該可以根據自身任務的繁重與否...

多執行緒 22 併發協作

生產者消費者模式 我們都在肯德基裡面吃過東西,kfc一般都很忙,別問我是怎麼知道的,我以前可是kfc優秀員工,他們先把漢堡 薯條 雞翅什麼都準備好放在乙個架子上,然後顧客過來買東西,前台員工只需要把顧客點的東西裝起來拿給顧客就好了。那個架子就是圖上的庫。這樣就可以實現解耦,我生產我的東西,你買你的東...