Java並發:等待事件發生後所有線程繼續執行

來源:互聯網
上載者:User

標籤:同步工具   log   map   ade   count   htm   ati   nbsp   art   

 

等待某一個指定的事件發生後,才讓多個等待的線程繼續執行,以下是我能想到的幾個方法,歡迎討論、指正。

 

1.閉鎖CountDownLatch

閉鎖是典型的等待事件發生的同步工具類,將閉鎖的初始值設定1,所有線程調用await方法等待,當事件發生時調用countDown將閉鎖值減為0,則所有await等待閉鎖的線程得以繼續執行。

 

2.阻塞隊列BlockingQueue

所有等待事件的線程嘗試從空的阻塞隊列擷取元素,將阻塞,當事件發生時,向阻塞隊列中同時放入N個元素(N的值與等待的線程數相同),則所有等待的線程從阻塞隊列中取出元素後得以繼續執行。

 

3.訊號量Semaphore

設定訊號量的初始值為等待的線程數N,一開始將訊號量申請完,讓剩餘的訊號量為0,待事件發生時,同時釋放N個佔用的訊號量,則等待訊號量的所有線程將擷取訊號量得以繼續執行。 

 

4.柵欄CyclicBarrier

設定柵欄的初始值為1,當事件發生時,調用barrier.wait()衝破設定的柵欄,將調用指定的Runable線程執行,在該線程中啟動N個新的子線程執行。這個方法並不是讓執行中的線程全部等待在某個點,待某一事件發生後繼續執行。

 

特別注意:不能用“條件隊列”,多個線程阻塞等待在條件隊列上,事件發生時調用“條件隊列”的notifyAll方法或者signalAll方法雖然能喚醒所有等待線程,但是只有一個線程能夠獲得該條件隊列的鎖得以調度執行,其它線程未獲得鎖仍將繼續阻塞等待。

 

Java並發:等待事件發生後所有線程繼續執行

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.