持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
控制Phaser的运行时机
线程一起到达屏障后继续运行,有些情况下是需要进行控制的,就是到达屏障后不允许继续运行。
线程实现代码如下:
public class ThreadA implements Runnable{
private Phaser phaser;
public ThreadA(Phaser phaser){
super();
this.phaser=phaser;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 第一个阶段开始时间:"+System.currentTimeMillis());
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName()+" 第一个阶段结束时间: "+System.currentTimeMillis());
}
}
运行类代码如下:
public class PhaserRunningTimeRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
for (int i = 0; i < 3 ; i++) {
ThreadA threadA = new ThreadA(phaser);
new Thread(threadA).start();
}
}
}
运行结果如下:
Thread-1 第一个阶段开始时间:1653553808149
Thread-0 第一个阶段开始时间:1653553808149
Thread-2 第一个阶段开始时间:1653553808150
Thread-2 第一个阶段结束时间: 1653553808150
Thread-1 第一个阶段结束时间: 1653553808151
Thread-0 第一个阶段结束时间: 1653553808151
修改运行类代码如下:
public class PhaserRunningTimeRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
phaser.register();
for (int i = 0; i < 3 ; i++) {
ThreadA threadA = new ThreadA(phaser);
new Thread(threadA).start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
phaser.arriveAndDeregister();
}
}
运行结果如下:
Thread-1 第一个阶段开始时间:1653554302114
Thread-0 第一个阶段开始时间:1653554302115
Thread-2 第一个阶段开始时间:1653554302115
Thread-1 第一个阶段结束时间: 1653554307117
Thread-0 第一个阶段结束时间: 1653554307117
Thread-2 第一个阶段结束时间: 1653554307117
从运行结果看出运行时机是可以通过逻辑控制,主要的原理是计数+1,然后通过逻辑代码的方式来决定线程是否继续向下运行。
phaser提供了动态增减parties计数,这点比CyclicBarrier类操作parties更加方便,通过若干个方法来控制多个线程之间同步运行的效果,使用并发类对线程进行分组同步控制时,Phaser比CyclicBarrier类功能更加强大。