含義java
柵欄容許兩個或者多個線程在某個集合點同步。當一個線程到達集合點時,它將調用await()方法等待其它的線程。線程調用await()方法後,CyclicBarrier將阻塞這個線程並將它置入休眠狀態等待其它線程的到來。等最後一個線程調用await()方法時,CyclicBarrier將喚醒全部等待的線程而後這些線程將繼續執行。CyclicBarrier能夠傳入另外一個Runnable對象做爲初始化參數。當全部的線程都到達集合點後,CyclicBarrier類將Runnable對象做爲線程執行。併發
方法ide
await():使線程置入休眠直到最後一個線程的到來以後喚醒全部休眠的線程測試
原理:設置賽馬集合點(線程啓動須要一些時間),而後一塊兒賽跑this
package org.java;spa
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;.netimport org.junit.Test;線程
public class TestCyclic {
@Test
public void test01() {
int count = 10;//併發線程數
CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
ExecutorService executorService = Executors.newFixedThreadPool(count);
int n = 0;
for (int i = 0; i < count; i++) {對象executorService.execute(new TestCyclic().new Task(cyclicBarrier, n));
n++;
}
executorService.shutdown(); // 關閉線程池
// 判斷是否全部的線程已經運行完
while (!executorService.isTerminated()) {
try {
// 全部線程池中的線程執行完畢,執行後續操做
// TODO
System.out.println(「==============is sleep============」);
Thread.sleep(10000);
System.out.println(「==============is wake============」);get} catch (InterruptedException e) {
e.printStackTrace();
}
}
}public class Task implements Runnable {
private CyclicBarrier cyclicBarrier;
int n = 0;public Task(CyclicBarrier cyclicBarrier, int n) {
this.cyclicBarrier = cyclicBarrier;
this.n = n;
}@Override
public void run() {
try {
// 等待全部任務準備就緒
System.out.println(「賽馬」 + n + 「到達柵欄前」);
cyclicBarrier.await();
System.out.println(「賽馬」 + n + 「開始跑」);
// 測試內容
System.out.println(「hello: 」 + n);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
運行代碼結果以下:
==============is sleep============
賽馬0到達柵欄前
賽馬1到達柵欄前
賽馬3到達柵欄前
賽馬2到達柵欄前
賽馬4到達柵欄前
賽馬5到達柵欄前
賽馬7到達柵欄前
賽馬6到達柵欄前
賽馬8到達柵欄前
賽馬9到達柵欄前
賽馬9開始跑
賽馬8開始跑
hello: 8
賽馬6開始跑
hello: 6
賽馬7開始跑
hello: 7
賽馬0開始跑
hello: 0
賽馬5開始跑
hello: 5
賽馬4開始跑
hello: 4
賽馬2開始跑
hello: 2
賽馬3開始跑
hello: 3
賽馬1開始跑
hello: 1
hello: 9
==============is wake============