Java并发练习:Phaser的简单使用

目标:使用Phaser构造简单阶段任务反馈

Phaser

  • 移相器:可重用的同步屏障,功能比CyclicBarrier与CountDownLatch更加灵活。
  • onAdvance:全部线程执行完毕后会进行调用,每次都会使参数phase的值+1,可用于判断阶段。返回true的话会结束phase。
  • register():线程进行注册,实际是进行一次信号+1。
  • arriveAndAwaitAdvance():阻塞并等待其他线程到达,等信号值达到一定值时会通过。
  • arriveAndDeregister():非阻塞,到达后直接注销一个信号。

代码:

package com.miracle.study.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Phaser;

/**
 * @author Miracle
 * @date 2021/4/14 21:08
 */
public class PhaserTest {

    /**
     * 集成phaser重写onAdvance
     */
    static class TaskPhaser extends Phaser{
        /**
         * 每一次全部线程到达都会导致phase的值+1。
         * @param phase
         * @param registeredParties
         * @return
         */
        @Override
        protected boolean onAdvance(int phase, int registeredParties) {
            switch (phase){
                case 0:
                    System.out.println("第一阶段任务完成,检测任务------------");
                    return false;
                case 1:
                    System.out.println("第二阶段任务完成,检测任务------------");
                    return false;
                case 2:
                    System.out.println("第三阶段任务完成,检测任务------------");
                    return true;
                default:
                    // 返回true就会使这个phaser停止了
                    return true;
            }
        }
    }

    /**
     * 线程任务类
     */
    static class Work implements Runnable{

        private Phaser phaser;

        private String name;

        public Work(Phaser phaser, String name){
            this.phaser = phaser;
            this.name = name;
        }

        @Override
        public void run() {
            phaser.register();
            try {
                System.out.println(name + "第一阶段进行中");
                Thread.sleep(100);
                // 等待其他线程完成任务
                phaser.arriveAndAwaitAdvance();
                System.out.println(name + "第二阶段进行中");
                Thread.sleep(100);
                // 等待其他线程完成任务
                phaser.arriveAndAwaitAdvance();
                System.out.println(name + "第三阶段进行中");
                Thread.sleep(100);
                // 等待其他线程完成任务
                phaser.arriveAndDeregister();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        TaskPhaser taskPhaser = new TaskPhaser();
        // 主线程先注册入phaser,保证所有线程完成后,然后进行注销,避免出现有的线程还没注册,就有一些线程完成第一阶段代码。
        taskPhaser.register();
        for (int i = 0; i < 10; i++){
            executorService.execute(new Work(taskPhaser, "task" + i));
        }
        // 等待并注销
        taskPhaser.arriveAndDeregister();
        Thread.sleep(2000);
        // 看taskPhaser是否已关闭
        System.out.println(taskPhaser.isTerminated());
        // 强制结束phaser
        taskPhaser.forceTermination();
        System.out.println(taskPhaser.isTerminated());
    }
}

参考

https://blog.csdn.net/liuyu973971883/article/details/107917079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌白在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值