package com.paymoon.demo.Ztest;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @author stevenlii
*
* CyclicBarrier:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
* 在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。
* 因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier可以多次重复使用
*/
public class CyclicBarrierTest_RelayRace {
public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("上一步全部完成,进入下一步……" );
}
});
System.out.println("王者荣耀随机单排开始");
for (int i = 0; i < 5; i++) {
exec.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ":进入选英雄界面...");
try {
barrier.await();
Thread.sleep((long) (2000 * Math.random()));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":选完英雄,进入加载...");
try {
barrier.await();
Thread.sleep((long) (2000 * Math.random()));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ ":加载到100%");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("欢迎"+Thread.currentThread().getName()+ " 来到王者荣耀,敌军还有30秒到达战场,全军出击!");
}
});
}
exec.shutdown();
}
}
运行结果
王者荣耀随机单排开始
pool-1-thread-1:进入选英雄界面...
pool-1-thread-2:进入选英雄界面...
pool-1-thread-3:进入选英雄界面...
pool-1-thread-5:进入选英雄界面...
pool-1-thread-4:进入选英雄界面...
上一步全部完成,进入下一步……
pool-1-thread-1:选完英雄,进入加载...
pool-1-thread-5:选完英雄,进入加载...
pool-1-thread-3:选完英雄,进入加载...
pool-1-thread-4:选完英雄,进入加载...
pool-1-thread-2:选完英雄,进入加载...
上一步全部完成,进入下一步……
pool-1-thread-4:加载到100%
pool-1-thread-1:加载到100%
pool-1-thread-5:加载到100%
pool-1-thread-2:加载到100%
pool-1-thread-3:加载到100%
上一步全部完成,进入下一步……
欢迎pool-1-thread-3 来到王者荣耀,敌军还有30秒到达战场,全军出击!
欢迎pool-1-thread-4 来到王者荣耀,敌军还有30秒到达战场,全军出击!
欢迎pool-1-thread-2 来到王者荣耀,敌军还有30秒到达战场,全军出击!
欢迎pool-1-thread-5 来到王者荣耀,敌军还有30秒到达战场,全军出击!
欢迎pool-1-thread-1 来到王者荣耀,敌军还有30秒到达战场,全军出击!
结论:
官方描述
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
但是实际应用中,除了CyclicBarrier 可以互相等待之外,还可以重复使用。重复使用这个,是CountDownLatch无法做到的,也就是state值CountDownLatch是无法重置的,这是两者最大区别