一起养成写作习惯!这是我参与「掘金日新计划 · 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,所以它们一直在等待。