一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。
因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
1、用枚举表示前政权和地方割据政权
import lombok.Getter;
public enum AfterTangEmpire {
ONE(1,"后蜀"), TOW(2,"南汉"),
THIRD(3,"北汉"),FOUR(4,"南唐");
@Getter
private int empireId;
@Getter
private String empireName;
AfterTangEmpire(int empireId, String empireName) {
this.empireId = empireId;
this.empireName = empireName;
}
public static String forEach_AfterTangEmpire(int index) {
AfterTangEmpire[] empires = AfterTangEmpire.values();
String name = null;
for (AfterTangEmpire e: empires
) {
if(e.empireId == index) {
name = e.empireName;
}
}
return name;
}
}
2、赵哥登场,灭国战争开始
package com.miller.mybatis.testLock;
import org.omg.PortableServer.THREAD_POLICY_ID;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
/**
* @program: mybatis
* @description: 到期后,才能让宋代登场
* @author: Miller.FAN
* @create: 2019-11-14 13:40
**/
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(4, ()->{
System.out.println("赵匡胤黄袍加身");
System.out.println("后周灭亡");
System.out.println("宋代开始发动统一战争!");
});
for (int i = 1; i < 5; i++) {
new Thread(()-> {
try {
System.out.println( Thread.currentThread().getName() + "开始");
cyclicBarrier.await();
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
} finally {
System.out.println( Thread.currentThread().getName() + "灭亡");
}
},AfterTangEmpire.forEach_AfterTangEmpire(i)).start();
}
cyclicBarrier.isBroken();
}
}
3、小总结
CyclicBarrier可以控制某线程执行之前,若干线程进入阻塞状态。等待,一直到初始化时传入的Runabble接口类型引用的任务执行完毕才能继续执行。
在这里的意思就是赵匡胤不当皇帝,后蜀、南汉、北汉、南唐这些政权只能建立,不许灭亡。
ONE(1,"后蜀"), TOW(2,"南汉"),
THIRD(3,"北汉"),FOUR(4,"南唐");
4、测试结果
后蜀开始
北汉开始
南汉开始
南唐开始
赵匡胤黄袍加身
后周灭亡
宋代开始发动统一战争!
南汉灭亡
北汉灭亡
南唐灭亡
后蜀灭亡