【并发编程】- Phaser

137 阅读2分钟

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

Phaser 使用arriveAndAwaitAdvance方法实现多赛段比赛

phaser具有多屏障的功能,类似于比赛中"赛段"的作用,运动员等一赛段结束后,开始休整准备,然后集体到达第二赛段起跑点等待比赛开始后,运动员们又继续比赛了。

使用Phaser实现一个比赛过程中的“多赛段”

实现代码如下:

public class PrintTools {
    public static Phaser phaser;
    public static void startFirstMethod(){
        System.out.println(Thread.currentThread().getName()+" 第一阶段开始!"+System.currentTimeMillis());
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName()+" 第一阶段结束!"+System.currentTimeMillis());

        System.out.println(Thread.currentThread().getName()+" 第二阶段开始!"+System.currentTimeMillis());
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName()+" 第二阶段结束!"+System.currentTimeMillis());
    }

    public static void startSecondMethod(){
        try {
        System.out.println(Thread.currentThread().getName()+" 第一阶段开始!"+System.currentTimeMillis());
        Thread.sleep(5000);
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName()+" 第一阶段结束!"+System.currentTimeMillis());

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

    private Phaser phaser;

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

    @Override
    public void run() {
        PrintTools.startFirstMethod();
    }
}
public class SecondThread implements Runnable{

    private Phaser phaser;

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

    @Override
    public void run() {
        PrintTools.startSecondMethod();
    }
}

运行类代码如下:

public class PhaserRun {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(2);
        PrintTools.phaser=phaser;

        FirstThread firstThread = new FirstThread(phaser);
        new Thread(firstThread).start();

        SecondThread secondThread = new SecondThread(phaser);
        new Thread(secondThread).start();

    }
}

运行结果如下:

Thread-0 第一阶段开始!1650767025266
Thread-1 第一阶段开始!1650767025268
Thread-0 第一阶段结束!1650767030273
Thread-0 第二阶段开始!1650767030274
Thread-1 第一阶段结束!1650767030274
Thread-1 第二阶段开始!1650767030274
Thread-0 第二阶段结束!1650767035276
Thread-1 第二阶段结束!1650767035276

方法arriveAndAwaitAdvance的作用是当先线程已经到达屏障,在此等待一段时间后,当条件满足后继续向下一个屏障继续执行。