Java: jsr166y Phaser 教程/讲解

标签 java concurrency phaser

This question两年前被问到,但它提到的资源要么不是很有帮助(恕我直言),要么链接不再有效。

必须有一些很好的教程才能理解 Phaser .我已经阅读了 javadoc,但我的眼睛呆滞了,因为为了真正理解 javadoc,您必须知道这些类应该如何使用。

有人有什么建议吗?

最佳答案

对于 Phaser,我已经回答了几个问题。看到它们可能有助于理解它们的应用。它们在底部链接。但是要了解 Phaser 的作用及其有用的原因,了解它解决的问题很重要。

这是 CountdownLatch 和 CyclicBarrier 的属性

注意:

  • 参与人数是不同线程数量的另一种说法
  • 不可重用意味着您必须创建一个新的实例 重用前的屏障
  • 如果线程可以到达并继续工作,则屏障是可推进的 无需等待其他线程或可以等待所有线程完成

CountdownLatch

  • 固定人数
  • 不可重用
  • Advanceable(查看latch.countDown(); advanceable latch.await(); 必须等待 )

CyclicBarrier

  • 固定人数
  • 可重复使用
  • 不可提前

所以CountdownLatch是不可重用的,每次都必须创建一个新的实例,但是是可以使用的。 CylicBarrier 可以重新使用,但所有线程都必须等待每一方到达屏障。

移相器

  • 动态参与人数
  • 可重复使用
  • 进阶

当线程想要被 Phaser 识别时,他们调用 phaser.register() 当线程到达屏障时,他们调用 phaser.arrive() 这就是它的先进之处。如果线程想要等待所有已注册的任务完成 phaser.arriveAndAwaitAdvance()

还有一个阶段的概念,其中线程可以等待其他可能尚未完成的操作完成。一旦所有线程都到达相位器的屏障,就会创建一个新相位(增量为 1)。

你可以看看我的其他回答,也许会有帮助:

Java ExecutorService: awaitTermination of all recursively created tasks

Flexible CountDownLatch?

关于Java: jsr166y Phaser 教程/讲解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6830904/

相关文章:

java对象序列化 - 线程安全?

Python 多处理与 unpicklable 对象

java - 使用和重用 Phaser 而不是 join()

java - 域名排序

java - 如何将 gradle 项目的子模块安装或发布为 jar

java - Thread.sleep() 卡住包含 GraphStream 图形的 JFrame/GUI

java - 我如何知道最后一方何时触发 Phaser.arrive()?

c++ - 为什么 C++ 引入了单独的 std::latch 和 std::barrier?

java - 如何比较基本类型中忽略大小写的字符

java - 如何将另一个非java程序的文件输出到java jar文件的资源文件夹中