【并发编程】- Phaser 使用awaitAdvance方法判断

121 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

Phaser的awaitAdvance(int phase)方法

方法awaitAdvance(int Phase)的作用是:如果传入参数phase值和当前getPhase()方法返回值一样,则在屏障处等待,否则继续向下运行,当条件满足了就等待,如果条件不满足,则程序向下继续运行。

线程执行代码如下:

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 ThreadC implements Runnable{

    private Phaser phaser;

    public ThreadC(Phaser phaser){
        super();
        this.phaser = phaser;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName()+ " 第一阶段开始时间: "+System.currentTimeMillis());
            Thread.sleep(3000);
            phaser.awaitAdvance(0);
            System.out.println(Thread.currentThread().getName()+" 第一阶段结束时间: "+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ThreadD implements Runnable {

    private Phaser phaser;

    public ThreadD(Phaser phaser){
        super();
        this.phaser=phaser;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName()+" 第一阶段开始时间: "+System.currentTimeMillis());
            Thread.sleep(5000);
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+" 第一阶段结束时间: "+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

运行类代码如下:

public class PhaserAwaitAdvanceRun {

    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);

        ThreadA threadA = new ThreadA(phaser);
        Thread thread1 = new Thread(threadA);
        thread1.setName("A");
        thread1.start();

        ThreadB threadB = new ThreadB(phaser);
        Thread thread2 = new Thread(threadB);
        thread2.setName("B");
        thread2.start();

        ThreadC threadC = new ThreadC(phaser);
        Thread thread3 = new Thread(threadC);
        thread3.setName("C");
        thread3.start();

        ThreadD threadD = new ThreadD(phaser);
        Thread thread4 = new Thread(threadD);
        thread4.setName("D");
        thread4.start();

    }
}

运行结果如下:

A 第一个阶段开始时间:1651028577414
B 第一个阶段开始时间:1651028577447
C 第一阶段开始时间: 1651028577448
D 第一阶段开始时间: 1651028577449
B 第一个阶段结束时间: 1651028582466
C 第一阶段结束时间: 1651028582466
A 第一个阶段结束时间: 1651028582467
D 第一阶段结束时间: 1651028582467

从运行结果看出,方法awaitAdvance(int Phase)并不不参与parties计数的操作,仅仅具有判断功能。