java - Java:jsr166y Phaser的教程/说明

原文 标签 java concurrency phaser

This question是两年前被问到的,但是它提到的资源不是很有帮助(IMHO),或者链接不再有效。

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

有人有什么建议吗?

最佳答案

对于Phaser,我已经回答了几个问题。看到他们可能有助于理解他们的应用程序。它们链接在底部。但是要了解Phaser的功能以及其有用性,了解其解决方案的重要性。

这是CountdownLatch和CyclicBarrier的属性

注意:

  • 参与方数是另一种表示#个不同线程的方式
  • 不可重用意味着您将必须创建一个新的
    重用
  • 之前的障碍
  • 如果线程可以到达并继续执行工作,则屏障是可提前的
    无需等待他人,也可以等待所有线程完成

  • 倒数计时
  • 固定的参与者数目
  • 不可续签
  • Advanceable(查看latch.countDown(); 可扩展latch.await(); 必须等待)

  • CyclicBarrier
  • 固定的参与者数目
  • 可重复使用的
  • 不可升级

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

    移相器
  • 动态各方
  • 可重复使用的
  • 可升级的

  • 当线程想要被Phaser知道时,他们会在线程到达障碍时调用phaser.register(),然后调用phaser.arrive() ,这是可扩展的。如果线程要等待所有注册的任务完成phaser.arriveAndAwaitAdvance()
    还有一个阶段的概念,其中线程可以等待可能尚未完成的其他操作完成。一旦所有线程到达移相器的屏障,就会创建一个新阶段(增量为1)。

    您可以看看我的其他答案,也许会有所帮助:

    Java ExecutorService: awaitTermination of all recursively created tasks

    Flexible CountDownLatch?

    相关文章:

    java - 使用ArrayList存储价格表的问题

    java - 将最后一个任务添加到BlockingQueue并丢弃其他任务的Java线程池

    java - ForkJoinPool,Phaser和托管阻塞:它们在多大程度上可以解决死锁?

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

    java - 移相器同步用法

    java - 在Java文件上显示swt选项卡

    java - 使用Java从文件读取算术表达式中的自然数

    java - 什么是NullPointerException,我该如何解决?

    c# - .NET多代理程序仿真(运行时加载/卸载)的插件体系结构

    java - 使用执行程序时如何同时启动线程?