我在多线程环境中经历不同的并发模型(http://tutorials.jenkov.com/java-concurrency/concurrency-models.html)
文章重点介绍了三种并发模型。
并行 worker
第一个并发模型就是我所说的并行 worker 模型。新的工作分配给不同的 worker 。
装配线
worker 像工厂流水线上的 worker 一样组织起来。每个 worker 只完成全部工作的一部分。当该部分完成后, worker 将工作转发给下一个 worker 。
每个工作线程都在自己的线程中运行,并且不与其他工作线程共享任何状态。这有时也称为无共享并发模型。
功能并行
函数并行的基本思想是使用函数调用来实现程序。函数可以看作是相互发送消息的“agents”或“actors”,就像在流水线并发模型(AKA 响应式(Reactive)或事件驱动系统)中一样。当一个函数调用另一个函数时,这类似于发送消息。
现在我想为这三个概念映射 java API 支持
Parallel Workers : 是 ExecutorService , ThreadPoolExecutor , CountDownLatch API?
Assembly Line:将事件发送到 JMS 等消息传递系统,并使用 Queues & Topics 的消息传递概念。
功能并行:ForkJoinPool在某种程度上和 java 8 流。与流相比,ForkJoin 池更容易理解。
我在映射这些并发模型时是否正确?如果不是请纠正我。
最佳答案
这些模型中的每一个都从一般的角度说明了工作是如何完成/拆分的,但在实现方面,它实际上取决于您的具体问题。一般我是这样看的:
- Parallel Workers:生产者在某处创建新作业(例如在
BlockingQueue
中),许多线程(通过ExecutorService
)处理这些作业在平行下。当然,您也可以使用CountDownLatch
,但这意味着您希望在处理完N
个子问题后触发一个 Action (例如,您知道您的大问题可能会被拆分在N
个较小的问题中,检查 the second example here )。 - Assembly Line:对于每个中间步骤,您都有一个
BlockingQueue
和一个Thread
或一个ExecutorService
。在每一步中,作业都从一个BlickingQueue
中取出并放入下一个,以便进一步处理。根据您对 JMS 的看法:JMS 用于连接分布式组件,是 Java EE 的一部分,不被认为可用于高并发上下文(消息通常在处理之前保存在硬盘上)。 - Functional Parallelism:
ForkJoinPool
是一个很好的例子,说明了如何实现这一点。
关于Java 支持三种不同的并发模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31627441/