java并发包之Phaser的onAdvance用法实例演示,秒懂
解决方法:
1.线程类
package com.wlg;
import java.util.concurrent.Phaser;
public class MyThread extends Thread {
public Phaser phaserser;
public MyThread( Phaser phaserser) {
this.phaserser = phaserser;
}
@Override
public void run() {
System.out.println("线程"+Thread.currentThread().getName()+"到达屏障开始等待时间:"+System.currentTimeMillis());
phaserser.arriveAndAwaitAdvance();
System.out.println("线程"+Thread.currentThread().getName()+"通过屏障时间:"+System.currentTimeMillis());
}
}
2.测试方法,给Phaser对象设置parties为2,每隔5秒分别启动ABC3个线程
public static void main( String[] args ) throws InterruptedException {
Phaser phaser = new Phaser(2){
protected boolean onAdvance(int phase, int registeredParties) {
System.out.println("当前是第"+phase+"个屏障");
return true;
}
};
MyThread threadA = new MyThread(phaser);
threadA.setName("A");
threadA.start();
Thread.sleep(5000);
MyThread threadB = new MyThread(phaser);
threadB.setName("B");
threadB.start();
Thread.sleep(5000);
MyThread threadC = new MyThread(phaser);
threadC.setName("C");
threadC.start();
}
3.结果打印,以下是onAdvance返回true的情况
线程A到达屏障开始等待时间:1590474826424
线程B到达屏障开始等待时间:1590474831424
当前是第0个屏障
线程B通过屏障时间:1590474831424
线程A通过屏障时间:1590474831424
线程C到达屏障开始等待时间:1590474836425
线程C通过屏障时间:1590474836425
可见线程A和线程B都执行arriveAndAwaitAdvance方法后一起通过屏障那个时刻,就会执行onAdvance里面的代码,执行完之后A和B线程再执行各自arriveAndAwaitAdvance方法后面的代码,onAdvance返回false说明下一次两个线程需要组队才能穿过屏障,如果返回true,下一次线程到达屏障时无需等待组队,可以继续执行代码。