1. 程式人生 > >Java併發程式設計之CyclicBarrier

Java併發程式設計之CyclicBarrier

CyclicBarrier可以控制這樣的場景:
對多個執行緒,他們執行自己程式碼(執行run方法)的時間不一樣;
比如有3個執行緒,其run方法執行時間分別為1s, 2s, 3s。如果我們想在三個執行緒都完成自己的任務時執行相應的操作,CyclicBarrier就派上用場了。

寫了一個簡單的測試類,方便理解:

package cn.demo;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest { private static int workerCount = 3; // 3個工人 private static CyclicBarrier barrier; // Worker類, 其中的run方法表示在做任務 static class Worker implements Runnable { @Override public void run() { try { Thread.sleep(new Random().nextInt(1000)); // 工人(當前執行緒)做完自己的任務經歷的時間 System.
out.println(Thread.currentThread().getName() + "做完了任務, 到達barrier,等待其他人。"); barrier.await(); // 工人(當前執行緒)在barrier前等待其他工人做完任務 System.out.println(Thread.currentThread().getName() + "繼續做自己的事情"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException
e) { e.printStackTrace(); } } } public static void main(String[] args) { // barrier = new CyclicBarrier(workerCount); // new CyclicBarrier(int parties, Runnable barrierAction) // 表示第parties個(也就是最後一個)執行緒到達barrier時,觸發barrierAction(也就是裡邊的run方法) barrier = new CyclicBarrier(workerCount, new Runnable() { @Override public void run() { System.out.println("最後一個完成任務的人:" + Thread.currentThread().getName()); } }); for (int i = 0; i < workerCount; i++) { new Thread(new Worker()).start(); } } }

可能的輸出結果:

Thread-1做完了任務, 到達barrier,等待其他人。
Thread-2做完了任務, 到達barrier,等待其他人。
Thread-0做完了任務, 到達barrier,等待其他人。
最後一個完成任務的人:Thread-0
Thread-0繼續做自己的事情
Thread-1繼續做自己的事情
Thread-2繼續做自己的事情

可以用圖表示為:

時間:------------------------------------>
--------------------barrier---------------
					|
T0	 	            |
T1                  |
T2                  |
	 	            |
	 	          T1| // 執行緒1先到,等待其他執行緒
	 	       T2   |
	 	   T0       |
	 	            |
	 	          T1| // 執行緒2也到了,由於3個人沒齊,執行緒1和2都在等
	 	          T2|
	 	      T0    |
	 	            |
	 	            T1 // 3個人都到了,放開屏障(barrier)
	 	            T2
	 	            T0

參考:
https://www.cnblogs.com/skywang12345/p/3533995.html

歡迎補充指正!