【并发编程】- Phaser 使用arrive方法消耗Parties值

95 阅读2分钟

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

Phaser的arrive()方法使用

实现Phaser计数不足时,线程1和线程2呈现等待状态。

实现代码如下:

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

    public void firstArriveAndAwaitAdvance(){
        try {
            System.out.println(Thread.currentThread().getName()+"第一阶段开始时间:"+System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println(phaser.getArrivedParties());
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+"第一阶段结束时间:"+System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName()+"第二阶段开始时间:"+System.currentTimeMillis());
            Thread.sleep(3000);
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+"第二阶段结束时间:"+System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName()+"第三阶段开始时间:"+System.currentTimeMillis());
            Thread.sleep(3000);
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+"第三阶段结束时间:"+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void secondArrive(){
            System.out.println(Thread.currentThread().getName()+"第一阶段开始时间:"+System.currentTimeMillis());
            phaser.arrive();
            System.out.println(Thread.currentThread().getName()+"第一阶段结束时间:"+System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName()+"第二阶段开始时间:"+System.currentTimeMillis());
            phaser.arrive();
            System.out.println(Thread.currentThread().getName()+"第二阶段结束时间:"+System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName()+"第三阶段开始时间:"+System.currentTimeMillis());
            phaser.arrive();
            System.out.println(Thread.currentThread().getName()+"第三阶段结束时间:"+System.currentTimeMillis());
    }
}

线程执行代码如下:

public class ThreadA implements Runnable{

    private PhaserArriveService service;

    public ThreadA(PhaserArriveService service){
        super();
        this.service=service;
    }

    @Override
    public void run() {
        service.firstArriveAndAwaitAdvance();
    }
}
public class ThreadB implements Runnable{

    private PhaserArriveService service;

    public ThreadB(PhaserArriveService service){
        super();
        this.service=service;
    }

    @Override
    public void run() {
        service.secondArrive();
    }
}

运行类代码如下:

public class PhaserArriveRun {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(2);
        PhaserArriveService service = new PhaserArriveService(phaser);

        ThreadA threadA = new ThreadA(service);
        new Thread(threadA).start();

        ThreadB threadB = new ThreadB(service);
        new Thread(threadB).start();
    }
}

运行结果如下:

Thread-0第一阶段开始时间:1650963943322
Thread-1第一阶段开始时间:1650963943358
Thread-1第一阶段结束时间:1650963943359
Thread-1第二阶段开始时间:1650963943359
Thread-1第二阶段结束时间:1650963943359
Thread-1第三阶段开始时间:1650963943359
Thread-1第三阶段结束时间:1650963943360
1
Thread-0第一阶段结束时间:1650963946337
Thread-0第二阶段开始时间:1650963946338

线程在parties计数达到2后自动重置成0,线程达不到parties为2,所以它们一直在等待。