【并发编程】- Phaser 屏障功能失效

144 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

Phaser的forceTermination()和isTerminated()方法

方法forceTermination()使Phaser对象的屏障功能失效,而方法isTerminated()是判断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 ThreadB implements Runnable{

    private Phaser phaser;

    public ThreadB(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 PhaserForceTerminationRun {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);
        ThreadA threadA = new ThreadA(phaser);
        new Thread(threadA).start();
        ThreadB threadB = new ThreadB(phaser);
        new Thread(threadB).start();
    }
}

运行结果如下:

Thread-0 第一个阶段开始时间:1653552412851
Thread-1 第一个阶段开始时间:1653552412855

从运行结果看出出现了开始时间,说明了2个线程呈阻塞状态,因为计数未达到3。

修改运行类代码如下:

public class PhaserForceTerminationRun {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);
        ThreadA threadA = new ThreadA(phaser);
        new Thread(threadA).start();
        ThreadB threadB = new ThreadB(phaser);
        new Thread(threadB).start();
        try {
            Thread.sleep(1000);
            phaser.forceTermination();
            System.out.println(phaser.isTerminated());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

Thread-0 第一个阶段开始时间:1653552731057
Thread-1 第一个阶段开始时间:1653552731059
Thread-1 第一个阶段结束时间: 1653552732068
Thread-0 第一个阶段结束时间: 1653552732070
true

从运行结果看出,Phaser执行forceTermination()方法时仅仅将屏障取消,线程继续往下执行,并不出现异常,而CyclicBarrier类的reset()方法执行时却出现异常。

Phaser可以实现针对某一个线程取消同步运行的效果,而且支持在指定屏障处等待,在等待时还支持中断或非中断等功能。