Java多线程之Phaser基础篇

在了解Phaser之前建议先过一下如下两篇文章,不了解也无妨如果看完有疑问的话可以再过一遍
Java多线程之CyclicBarrier基础篇
Java多线程之CountDownLatch基础篇

一、 什么是Phaser
  • Phaser可以认为是CyclicBarrier与CountDownLatch的整合,可以用考试做类比,一个班级进行考试必须等所有同学(这里的同学做题可以看做不同的线程在执行任务)答完题,才能进入下一科考试
二、为什么可以将Phaser认为是CyclicBarrier与CountDownLatch的整合
  • 我们可以回忆一下CountDownLatch讲的是先指定N个线程干完活,在这N个线程干完活之前,其他线程先等着,CyclicBarrier讲的是先指定需要N个线程,等N个线程到齐了大家同时干活(并发执行),而Phaser正是结合了这二者的特点,可以理解为先指定N个线程等N个线程到齐了开始干第一阶段的活,等第一阶段所有线程干完活了,接着这N个线程继续开始干下一阶段的活,以此类推直至干完业务逻辑了所有阶段的活(当然每个阶段可以干完进入下一个阶段可以踢掉一下不需要的线程,可以理解完造房子,在后期收尾时就不需要那么多人了可以辞掉一些,当然也可以全部留下来,不剔除)
三、Phaser代码示例
public class MyPhaser {
    private static ExamPhaser examPhaser = new ExamPhaser();

    public static void main(String[] args) {
        examPhaser.bulkRegister(5);
        new Thread(new Student(), "学生A").start();
        new Thread(new Student(), "学生B").start();
        new Thread(new Student(), "学生C").start();
        new Thread(new Student(), "学生D").start();
        new Thread(new Student(), "学生E").start();
    }

    static class Student implements Runnable {


        private static void chinese() {
            System.out.println(Thread.currentThread().getName() + "语文考试完毕");
            examPhaser.arriveAndAwaitAdvance();
        }

        private static void math() {
            System.out.println(Thread.currentThread().getName() + "数学考试完毕");
            examPhaser.arriveAndAwaitAdvance();
        }

        private static void english() {
            System.out.println(Thread.currentThread().getName() + "英语考试完毕");
            examPhaser.arriveAndAwaitAdvance();
        }

        private static void history() {
            System.out.println(Thread.currentThread().getName() + "历史考试完毕");
            examPhaser.arriveAndAwaitAdvance();
        }

        @Override
        public void run() {
            chinese();
            math();
            english();
            history();

        }
    }

    static class ExamPhaser extends Phaser {
        @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 false;
                case 3:
                    System.out.println("历史考试结束!");
                    return true;
                default:
                    return true;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值