//CyclicBarrier反复线程计数:一个司令集结士兵,执行任务的例子
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
/**
* 士兵的Thread
*
*/
public static class Soldier implements Runnable {
private final CyclicBarrier cyclicBarrier;
public Soldier(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
doPresent(); // 士兵开始报道
// if(CommanderRun.getCount()==5){Thread.currentThread().interrupt(); }
cyclicBarrier.await(); // 等待所有士兵到齐
doWork(); // 士兵集合完毕,开始执行任务
cyclicBarrier.await(); // 等待所有士兵完成任务
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
/**
* 士兵报道
*/
private void doPresent() {
try {
Thread.sleep(new Random().nextInt(10) * 1000); // 士兵报道需要的时间不定
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + " :报道!");
CommanderRun.autoIncrement(); // 司令记录一个士兵报道
}
}
/**
* 士兵执行任务
*/
private void doWork() {
try {
Thread.sleep(new Random().nextInt(10) * 1000); // 士兵完成任务需要的时间不定
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + " :任务完成");
}
}
}
/**
* 司令的Thread
*
*/
public static class CommanderRun implements Runnable {
boolean flag;
static int count; // 司令统计的士兵个数
public CommanderRun(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
System.out.println("司令:【士兵" + count + "个,任务完成!】");
} else {
System.out.println("司令:【士兵" + count + "个,集合完毕!】");
flag = true;
}
}
public synchronized static void autoIncrement() {
count++;
}
}
public static void main(String args[]) throws InterruptedException {
final int count = 10; //20
Thread[] allSoldier = new Thread[count];
boolean flag = false;
CyclicBarrier cyclicBarrier = new CyclicBarrier(count, new CommanderRun(flag));
// 设置屏蔽点,主要是为了执行这个方法
System.out.println("司令一声令下:“集合队伍!”");
for (int i = 0; i < allSoldier.length; i++) {
String soldierThreadName = "士兵 " + i;
allSoldier[i] = new Thread(new Soldier(cyclicBarrier), soldierThreadName);
allSoldier[i].start();
}
}
}
JDK并发包---(10)循环栅栏:CyclicBarrier
最新推荐文章于 2024-06-09 00:26:23 发布