Phaser构建了一个更加灵活的同步屏障,和前面文章中提到的CountDownLatch与CyclicBarrier屏障器一样,Phaser也能使得一组线程在屏障上等待,在最后一条线程到达之后,这些线程就能继续执行了。Phaser的灵活在于它可以协调不定数目的线程,线程可以在任何时刻加入。
为了达到灵活性的目的,Phaser定义了表达状态的phase值,phase的初始值是0,当线程都到达指定的屏障点时,它的值就会自动加1.我们可以灵活使用这个值来做多个线程的分阶段任务的交互。在实际编程的时候我们通常会重写一个方法:onAdvance(int phase,int registeredParties),当phase值发生变化时这个方法会自动调用,当它返回true时,Phaser就结束了。
为了演示Phaser的灵活应用,我们模拟一个多阶段屏障点的程序,假设有3个工程师同时来公司面试,面试一共有2轮,分别是笔试和面试,只有他们都到齐了才能开始笔试,只有笔试都结束了才能开始面试。我们看一下这个实例的实现代码:
参考链接