【并发编程】- Phaser 批量添加parties数量

698 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

接着上一篇文章 【并发编程】- Phaser

一种情况是一个线程中途因异常或其他情况退出了,可能导致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数量。