This question两年前被问到,但它提到的资源要么不是很有帮助(恕我直言),要么链接不再有效。
必须有一些很好的教程才能理解 Phaser
.我已经阅读了 javadoc,但我的眼睛呆滞了,因为为了真正理解 javadoc,您必须知道这些类应该如何使用。
有人有什么建议吗?
最佳答案
对于 Phaser,我已经回答了几个问题。看到它们可能有助于理解它们的应用。它们在底部链接。但是要了解 Phaser 的作用及其有用的原因,了解它解决的问题很重要。
这是 CountdownLatch 和 CyclicBarrier 的属性
注意:
- 参与人数是不同线程数量的另一种说法
- 不可重用意味着您必须创建一个新的实例 重用前的屏障
- 如果线程可以到达并继续工作,则屏障是可推进的 无需等待其他线程或可以等待所有线程完成
CountdownLatch
- 固定人数
- 不可重用
- Advanceable(查看
latch.countDown();
advanceablelatch.await();
必须等待 )
CyclicBarrier
- 固定人数
- 可重复使用
- 不可提前
所以CountdownLatch是不可重用的,每次都必须创建一个新的实例,但是是可以使用的。 CylicBarrier 可以重新使用,但所有线程都必须等待每一方到达屏障。
移相器
- 动态参与人数
- 可重复使用
- 进阶
当线程想要被 Phaser 识别时,他们调用 phaser.register()
当线程到达屏障时,他们调用 phaser.arrive()
这就是它的先进之处。如果线程想要等待所有已注册的任务完成 phaser.arriveAndAwaitAdvance()
还有一个阶段的概念,其中线程可以等待其他可能尚未完成的操作完成。一旦所有线程都到达相位器的屏障,就会创建一个新相位(增量为 1)。
你可以看看我的其他回答,也许会有帮助:
Java ExecutorService: awaitTermination of all recursively created tasks
关于Java: jsr166y Phaser 教程/讲解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16571482/