等待某一個指定的事件發生后,才讓多個等待的線程繼續執行,以下是我能想到的幾個方法,歡迎討論、指正。
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方法雖然能喚醒所有等待線程,但是只有一個線程能夠獲得該條件隊列的鎖得以調度執行,其它線程未獲得鎖仍將繼續阻塞等待。