Java支持三种不同的并发模型

我在multithreading环境中经历了不同的并发模型( http://tutorials.jenkov.com/java-concurrency/concurrency-models.html )

本文重点介绍了三种并发模型

  1. 并行工人

    第一个并发模型就是我所说的并行工作模型。 传入的工作分配给不同的工作人员

  2. 流水线

    工人的组织就像工厂assembly线上的工人一样。 每个工人只执行完整工作的一部分。 当该部分完成时,工人将工作转发给下一个工人。

    每个工作者都在自己的线程中运行,并且不与其他工作者共享任何状态。 这有时也称为无共享并发模型。

  3. function并行

    函数并行的基本思想是使用函数调用实现程序。 函数可以被视为彼此发送消息的“ 代理 ”或“ 参与者 ”,就像在流水线并发模型(AKA反应或事件驱动系统)中一样。 当一个函数调用另一个函数时,这类似于发送消息。

现在我想为这三个概念映射java API支持

  1. 并行工作者 :它是ExecutorService , ThreadPoolExecutor , CountDownLatch API吗?

  2. assembly线 :将事件发送到JMS等消息传递系统并使用队列和主题的消息传递概念。

  3. function并行 : ForkJoinPool在某种程度上和java 8流。 与溪流相比,ForkJoin池易于理解。

我是否正确映射这些并发模型? 如果没有,请纠正我。

这些模型中的每一个都说明了如何从一般的角度来完成/分割工作,但是当涉及到实现时,它实际上取决于您的确切问题。 一般来说,我这样看:

  1. 并行工作者 :生产者在某处创建新作业(例如在BlockingQueue ),许multithreading(通过ExecutorService )并行处理这些作业。 当然,您也可以使用CountDownLatch ,但这意味着您希望在处理完 N个子问题后触发操作(例如,您知道您的大问题可能会分成N较小的问题,请查看此处的第二个示例 )。
  2. assembly线 :对于每个中间步骤,您都有一个BlockingQueue和一个ThreadExecutorService 。 在每一步中,作业从一个BlickingQueue并放入下一个,以便进一步处理。 根据您的想法使用JMS:JMS用于连接分布式组件,并且是Java EE的一部分,并且不被认为在高并发上下文中使用(消息通常在处理之前保留在硬盘上)。
  3. function并行ForkJoinPool是一个很好的例子,说明如何实现它。

一个很好的问题,答案可能不会令人满意。 列出的并发模型显示了您可能希望实现并发系统的一些方法。 API提供用于实现任何这些模型的工具。

让我们从ExecutorService开始。 它允许您以非阻塞方式提交要执行的任务。 然后,ThreadPoolExecutor实现限制可用的最大线程数。 ExecutorService不要求任务像您对并行工作程序一样执行完整的过程。 任务可以限于该过程的特定部分,并在完成时发送消息,该消息开始于assembly线中的下一步骤。

CountDownLatch和ExecutorService提供了一种阻止的方法,直到所有工作者完成,如果某个进程被划分为不同的并发子任务,这可能会派上用场。

JMS的目的是为组件之间的消息传递提供一种方法。 它不强制执行特定的并发模型。 队列和主题表示如何将消息从发布者发送到订阅者。 使用队列时,消息将发送给一个订户。 另一方面,主题将消息广播给该主题的所有订阅者。

通过例如使用观察者模式,可以在单个组件内实现类似的行为。

ForkJoinPool实际上是ExecutorService的一个实现(可能突出了匹配模型和实现细节的难度)。 它恰好被优化用于处理大量小任务。

简介:在Java环境中有多种方法可以实现某种并发模型。 无论选择何种并发模型,实现程序时使用的接口,类和框架都可能有所不同。