持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
Phaser的forceTermination()和isTerminated()方法
方法forceTermination()使Phaser对象的屏障功能失效,而方法isTerminated()是判断Phaser对象是否已经呈销毁状态。
线程实现代码如下:
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 PhaserForceTerminationRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
ThreadA threadA = new ThreadA(phaser);
new Thread(threadA).start();
ThreadB threadB = new ThreadB(phaser);
new Thread(threadB).start();
}
}
运行结果如下:
Thread-0 第一个阶段开始时间:1653552412851
Thread-1 第一个阶段开始时间:1653552412855
从运行结果看出出现了开始时间,说明了2个线程呈阻塞状态,因为计数未达到3。
修改运行类代码如下:
public class PhaserForceTerminationRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
ThreadA threadA = new ThreadA(phaser);
new Thread(threadA).start();
ThreadB threadB = new ThreadB(phaser);
new Thread(threadB).start();
try {
Thread.sleep(1000);
phaser.forceTermination();
System.out.println(phaser.isTerminated());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
Thread-0 第一个阶段开始时间:1653552731057
Thread-1 第一个阶段开始时间:1653552731059
Thread-1 第一个阶段结束时间: 1653552732068
Thread-0 第一个阶段结束时间: 1653552732070
true
从运行结果看出,Phaser执行forceTermination()方法时仅仅将屏障取消,线程继续往下执行,并不出现异常,而CyclicBarrier类的reset()方法执行时却出现异常。
Phaser可以实现针对某一个线程取消同步运行的效果,而且支持在指定屏障处等待,在等待时还支持中断或非中断等功能。