一起养成写作习惯!这是我参与「掘金日新计划 · 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的作用是当先线程已经到达屏障,在此等待一段时间后,当条件满足后继续向下一个屏障继续执行。