一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (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、測試結果
後蜀開始
北漢開始
南漢開始
南唐開始
趙匡胤黃袍加身
後周滅亡
宋代開始發動統一戰爭!
南漢滅亡
北漢滅亡
南唐滅亡
後蜀滅亡