一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
Phaser的awaitAdvanceInterruptibly(int)方法
方法awaitAdvanceInterrupt(int)是不可中断的。
实现代码如下:
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.awaitAdvance(0);
System.out.println(Thread.currentThread().getName()+" 第一个阶段结束时间: "+System.currentTimeMillis());
}
}
运行类代码如下:
public class PhaserAwaitAdvanceInterruptRun {
public static void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
ThreadA threadA = new ThreadA(phaser);
Thread thread = new Thread(threadA);
thread.start();
Thread.sleep(5000);
thread.interrupt();
System.out.println("中断了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
Thread-0 第一个阶段开始时间:1651047269157
中断了
从运行结果可看出,控制台没出现异常,说明线程并未中断。
方法awaitAdvanceInterruptibly(int)是可中断的
线程执行代码如下:
public class ThreadA implements Runnable{
private Phaser phaser;
public ThreadA(Phaser phaser){
super();
this.phaser=phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+" 第一个阶段开始时间: "+System.currentTimeMillis());
phaser.awaitAdvanceInterruptibly(0);
System.out.println(Thread.currentThread().getName()+" 第一个阶段结束时间: "+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行类代码如下:
public class PhaserAwaitAdvanceInterruptRun {
public static void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
ThreadA threadA = new ThreadA(phaser);
Thread thread = new Thread(threadA);
thread.start();
Thread.sleep(5000);
thread.interrupt();
System.out.println("中断了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
Thread-0 第一个阶段开始时间:1651047604672
中断了
java.lang.InterruptedException
at java.util.concurrent.Phaser.awaitAdvanceInterruptibly(Phaser.java:760)
at com.ozx.concurrentprogram.phaser.entity.ThreadA.run(ThreadA.java:35)
at java.lang.Thread.run(Thread.java:748)
从运行结果可看出,控制台出现异常,线程被中断了。
方法awaitAdvanceInterruptibly(int)的作用是当线程执行的拦数不符合指定的参数值时,则继续执行往下执行代码。
线程执行代码如下:
public class ThreadA implements Runnable{
private Phaser phaser;
public ThreadA(Phaser phaser){
super();
this.phaser=phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+" 第一个阶段开始时间:"+System.currentTimeMillis());
phaser.awaitAdvanceInterruptibly(10);//不符合栏数就继续运行
System.out.println(Thread.currentThread().getName()+" 第一个阶段结束时间: "+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
实现代码如下:
public class PhaserAwaitAdvanceInterruptRun {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
ThreadA threadA = new ThreadA(phaser);
Thread thread = new Thread(threadA);
thread.start();
}
}
运行结果如下:
Thread-0 第一个阶段开始时间:1651112245645
Thread-0 第一个阶段结束时间: 1651112245647
从运行结果看出,程序快速继续向下运行,运行的时间都是一样的,继续向下运行原因是栏数不符合10个。