在了解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;
}
}
}
}