一起养成写作习惯!这是我参与「掘金日新计划 · 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计数的操作,仅仅具有判断功能。