java phaser详解,Java多线程之Phaser基础篇

一、 什么是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、付费专栏及课程。

余额充值