package com.huang.test.concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* 循环屏障,可重复使用。(当多个线程需要同一起跑线的情景的时候)
* parties 为线程数。在所有的线程都执行到await后所有的接除阻塞,并执行CyclicBarrier第二个构造函数的runnable
*/
public class CyclicBarrierTest {
private void test() {
int parties = 3;
CyclicBarrier barrier = new CyclicBarrier(parties, new Runnable() {
@Override
public void run() {
System.out.println("----- haha all end... -----");
}
});
System.out.println("numberWaiting:" + barrier.getNumberWaiting() + "\n" +
"parties:" + barrier.getParties() + "\n" +
"isbroken:" + barrier.isBroken()
);
for(int i = 0;i < parties;i++)
{
final int t = i;
new Thread()
{
@Override
public void run() {
super.run();
try {
System.out.println("thread " + t + " start...");
Thread.sleep((t + 1) * 1000);
System.out.println("thread " + t + " end...");
barrier.await();
//当所有都有的都在同一起跑线。
System.out.println("let's fuck " + t + "! ");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}.start();
}
}
public static void main(String[] args) {
CyclicBarrierTest cbt = new CyclicBarrierTest();
cbt.test();
}
}