一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
一种情况是一个线程中途因异常或其他情况退出了,可能导致phaser计数不足时,线程呈阻塞状态,不继续向下运行。
使用phaser实现线程中途退出,使parties值对应减少
实现代码如下:
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);
System.out.println("1 RegisteredParties:"+phaser.getRegisteredParties());
phaser.arriveAndDeregister();
System.out.println(" 2 RegisteredParties:"+phaser.getRegisteredParties());
System.out.println(Thread.currentThread().getName()+" 第一阶段结束!"+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
Thread-0 第一阶段开始!1650769417182
Thread-1 第一阶段开始!1650769417190
1 RegisteredParties:2
2 RegisteredParties:1
Thread-0 第一阶段结束!1650769422192
Thread-0 第二阶段开始!1650769422193
Thread-0 第二阶段结束!1650769422194
Thread-1 第一阶段结束!1650769422193
使用phaser.arriveAndDeregister()方法使parties值动态减少。
Phaser的getRegisteredParties()方法和register()测试
运行类代码如下:
public class PhaserRegisterRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(5);
System.out.println(phaser.getRegisteredParties());
phaser.register();
System.out.println(phaser.getRegisteredParties());
phaser.register();
System.out.println(phaser.getRegisteredParties());
phaser.register();
System.out.println(phaser.getRegisteredParties());
}
}
运行结果如下:
5
6
7
8
从运行结果可看出,方法getRegisteredParties()获得注册的parties的数量。每执行一次方法register()就动态添加一个parties值。
phaser批量添加parties数量
实现代码如下:
public class PhaserBulkRegisterRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(10);
System.out.println(phaser.getRegisteredParties());
phaser.bulkRegister(10);
System.out.println(phaser.getRegisteredParties());
phaser.bulkRegister(10);
System.out.println(phaser.getRegisteredParties());
phaser.bulkRegister(10);
System.out.println(phaser.getRegisteredParties());
}
}
实现代码如下:
10
20
30
40
从运行结果可看出,方法bulkRegister()可以批量增加Parties数量。