【并发编程】- Phaser 使用awaitAdvance方法异常中断机制

548 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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个。