柵欄類似於閉鎖,它能阻塞一組線程直到某個事件發生。柵欄與閉鎖的關鍵區別在於,所有線程必須同時到達柵欄位置,
才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他線程,且能夠重複執行。
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class TestCyclicBarrier {
private final CyclicBarrier barrier;
private final Worker[] workers;
public TestCyclicBarrier() {
int count = Runtime.getRuntime().availableProcessors();
barrier = new CyclicBarrier(count, new Runnable() {
@Override
public void run() {
System.out.println("所有線程均到達柵欄位置,開始下一輪");
}
});
this.workers = new Worker[count];
for(int i = 0; i < count; i++) {
workers[i] = new Worker(i);
}
}
private class Worker implements Runnable {
int i;
public Worker(int i) {
this.i = i;
}
@Override
public void run() {
for(int index = 1; index < 3; index++) {
System.out.println("線程" + i + "第" + index + "次到達柵欄位置,等待其他線程!");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
public void start() {
for(int i = 0; i < workers.length; i++) {
new Thread(workers[i]).start();
}
}
public static void main(String[] args) {
new TestCyclicBarrier().start();
}
}