java并发包之Phaser的arriveAndDeregister方法用法实例演示,秒懂
解决方法:
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为3,只启动AB两个线程,睡眠5秒后注销一个parties
public static void main( String[] args ) throws InterruptedException {
Phaser phaser = new Phaser(3);
MyThread threadA = new MyThread(phaser);
threadA.setName("A");
threadA.start();
MyThread threadB = new MyThread(phaser);
threadB.setName("B");
threadB.start();
System.out.println("注销前parties数:"+phaser.getRegisteredParties());
Thread.sleep(5000);
phaser.arriveAndDeregister();
System.out.println("注销后parties数:"+phaser.getRegisteredParties());
}
3.结果打印
注销前parties数:3
线程B到达屏障开始等待时间:1590473423756
线程A到达屏障开始等待时间:1590473423756
注销后parties数:2
线程B通过屏障时间:1590473428757
线程A通过屏障时间:1590473428757
可见线程A和线程B都执行arriveAndAwaitAdvance方法后进入等待状态,由于设置了parties是3,所以要3个线程组队才能一起通过屏障继续执行,但目前只有两个线程的话只能通过arriveAndDeregister()使parties减1,等待中的线程AB才可以继续往下执行。