1. 程式人生 > >java併發程式設計系列之CyclicBarrier的使用

java併發程式設計系列之CyclicBarrier的使用

在日常活動中,經常會遇到這樣一種場景:我們會約定在某個地點集合,等所有的組員都集合後,然後我們才開始活動,等活動結束後,所有的組員再一次集合,報道後再各自回家。在我們的程式中,也會經常遇到這種場景,需要所有的子執行緒都結束之後,再匯聚所有的結果,然後根據結果在決定下一步的操作,這個時候,我們就需要使用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到達園博園了!
所有人都到了,開始活動……

從測試結果可以看出,執行緒之間是互相等待,直到所有的執行緒都到達集合點之後,才會往下走。