【并发编程】- Phaser 运行时机控制

173 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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类功能更加强大。