文章目录
JUC 即 java.util.concurrent 包,提供了大量的工具类来简化并发编程。
CountDownLatch和CyclicBarrier都是只适用于固定数量的参与者。
1. Phaser 更加灵活
不仅屏障数量可变,还设置了多个阶段。
public class PhaserDemo {
static class KillerGamePhaser extends Phaser {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
switch (phase) {
case 0:
System.out.println("第一次迭代,存活人数:" + registeredParties);
return false;
case 1:
System.out.println("第二次迭代,存活人数:" + registeredParties);
return true;
default:
return true;
}
}
}
static Phaser phaser = new KillerGamePhaser();
public static void main(String[] args) {
Thread[] threads = new Thread[10];
Random rand = new Random();
phaser.bulkRegister(10);
for (Thread t : threads) {
t = new Thread(() -> {
phaser.arriveAndAwaitAdvance();
if(rand.nextInt(10)>5){
System.out.println(Thread.currentThread().getName()+ "我成功了");
phaser.arriveAndAwaitAdvance();
}
else{
System.out.println(Thread.currentThread().getName()+ "黯然离场");
phaser.arriveAndDeregister();
}
});
t.start();
}
}
}
运行结果:
显示第一阶段到达
总结
phaser常用在遗传算法中,用于每一代的筛选和迭代。
多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。
https://github.com/forestnlp/concurrentlab
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。