一尘不染

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

java

我正在多线程环境中通过不同的并发模型(http://tutorials.jenkov.com/java-concurrency/concurrency-
models.html)

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

  1. 平行工人

第一个并发模型是我所说的并行工作器模型。进来的工作分配给不同的 工人

  1. 流水线

工人的组织就像 工厂 中装配线的工人一样。每个工人仅完成全部工作的一部分。完成该部分后,工人会将工作转发给下一个工人。

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

  1. 功能并行

函数并行性的基本思想是使用函数调用实现程序。功能可以看作是相互发送消息的“ 代理 ”或“ 参与者
”,就像在组装线并发模型(AKA反应或事件驱动系统)中一样。当一个函数调用另一个函数时,这类似于发送消息。

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

  1. 并行工作者 :是ExecutorServiceThreadPoolExecutorCountDownLatch API吗?

  2. 组装流水线* :使用 队列和主题的 消息概念将事件发送到 JMS 等消息系统。 *

  3. 功能并行性ForkJoinPool在某种程度上与Java 8流有关。与流相比,ForkJoin池易于理解。

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


阅读 177

收藏
2020-12-03

共1个答案

一尘不染

这些模型中的每一个都从一般角度说明了工作是如何完成/拆分的,但是在实施时,这实际上取决于您的确切问题。通常我会这样看:

  1. 并行工作者 :生产者在某个地方(例如,在中BlockingQueue)创建新的工作,并且许多线程(通过ExecutorService)并行处理这些工作。当然,您也可以使用CountDownLatch,但是这意味着您想在完全解决了N子问题之后触发一个操作(例如,您知道大问题可能会分解为N小问题,请在此处查看第二个示例)。
  2. 装配线 :对于每个中间步骤,您都有一个BlockingQueue和一个Thread或一个ExecutorService。在每个步骤中,作业都从一个步骤中取出,BlickingQueue然后放入下一个步骤中,以进行进一步处理。对于JMS,您的想法是:JMS可以连接分布式组件,并且是Java EE的一部分,不被认为是在高并发上下文中使用的(消息通常在处理之前保存在硬盘上)。
  3. 功能并行ForkJoinPool是如何实现此 功能的 一个很好的例子。
2020-12-03