import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
static class TaskThread extends Thread {
CyclicBarrier barrier;
public TaskThread(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(getName() + " 到达栅栏 A");
System.out.println("O(∩_∩)O哈哈~" + barrier.getNumberWaiting());
barrier.await();
System.out.println(getName() + " 冲破栅栏 A");
Thread.sleep(2000);
System.out.println(getName() + " 到达栅栏 B");
System.out.println("哈哈" + barrier.getNumberWaiting());
barrier.await();
System.out.println(getName() + " 冲破栅栏 B");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int threadNum = 5;
CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 完成最后任务");
}
});
for(int i = 0; i < threadNum; i++) {
new TaskThread(barrier).start();
}
}
}
每一个 await() 都是一轮;
所有线程在到达第一个await()时,最后一个到达的线程会执行一次Runnable 里面的任务;
然后重置;
然后所有线程都继续执行,直到遇到第二个await(),等所有线程都到达第二个await()时,最后一个到达第二个await()的线程又会去执行一次Runnable 里面的任务;
然后再重置;
...
结果:会执行目标runnable
原理:new CyclicBarrier() 中的 Runnable 参数,意思就是最后一个到达线程要做的任务