java併發程式設計系列之CyclicBarrier的使用
阿新 • • 發佈:2019-01-01
在日常活動中,經常會遇到這樣一種場景:我們會約定在某個地點集合,等所有的組員都集合後,然後我們才開始活動,等活動結束後,所有的組員再一次集合,報道後再各自回家。在我們的程式中,也會經常遇到這種場景,需要所有的子執行緒都結束之後,再匯聚所有的結果,然後根據結果在決定下一步的操作,這個時候,我們就需要使用CyclicBarrier,進行執行緒的同步。下面先看一個簡單的示例,程式碼如下:
public class CyclicBarrierDemo { public static void main(String[] args) throws InterruptedException { // 新建一個CyclicBarrier,同時指定到達集合點的個數和到達集合點之後要做什麼事 final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("所有人都到了,開始活動……"); } }); /* * 新建5個執行緒,此處執行緒數必須和CyclicBarrier中到達集合點的個數一致,否則會出問題 * 如果此處設定成4的話,就會一直等待,直到第5個執行緒到來 */ ExecutorService service = Executors.newFixedThreadPool(5); // 提交5個任務 for(int i=0; i<5; i++){ Thread.sleep(1000); service.execute(new Runnable() { @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"到達園博園了!"); Thread.sleep(2000); // 在此等待,直到所有的執行緒都到這裡,才往下走 barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }); } // 釋放執行緒池資源 service.shutdown(); } }
測試結果如下:
pool-1-thread-1到達園博園了!
pool-1-thread-2到達園博園了!
pool-1-thread-3到達園博園了!
pool-1-thread-4到達園博園了!
pool-1-thread-5到達園博園了!
所有人都到了,開始活動……
從測試結果可以看出,執行緒之間是互相等待,直到所有的執行緒都到達集合點之後,才會往下走。