Java併發程式設計之CyclicBarrier
阿新 • • 發佈:2018-10-31
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
歡迎補充指正!