Java 支持三种不同的并发模型
Java support for three different concurrency models
我正在研究多线程环境中的不同并发模型 (http://tutorials.jenkov.com/java-concurrency/concurrency-models.html)
文章重点介绍三种并发模型。
并行工作者
第一个并发模型就是我所说的并行工作者模型。传入的工作分配给不同的 工人。
流水线
工人的组织方式类似于工厂流水线上的工人。每个工人只执行全部工作的一部分。该部分完成后,工作人员将工作转发给下一个工作人员。
每个工人 运行 在自己的线程中,不与其他工人共享任何状态。这有时也称为无共享并发模型。
函数式并行
函数式并行的基本思想是使用函数调用来实现程序。函数可以看作是相互发送消息的“agents”或“actors”,就像在流水线并发模型中一样(又名反应式或事件驱动系统)。当一个函数调用另一个函数时,这类似于发送消息。
现在我要映射javaAPI支持这三个概念
Parallel Workers : 是ExecutorService,ThreadPoolExecutor, CountDownLatch API?
装配线 : 发送一个事件到像JMS这样的消息系统&使用[=43=的消息概念]队列和主题。
函数式并行:ForkJoinPool 在某种程度上 & java 8 个流。 ForkJoin 池相对于流来说很容易理解。
我在映射这些并发模型时是否正确?如果不对请指正。
一个很好的问题,但答案可能不太令人满意。列出的并发模型显示了您可能想要实现并发系统的一些方法。 API 提供了用于实现这些模型的工具。
让我们从 ExecutorService 开始。它允许您提交要以非阻塞方式执行的任务。 ThreadPoolExecutor 实现然后限制可用线程的最大数量。 ExecutorService 不需要任务来执行您可能期望的并行工作进程的完整过程。该任务可能仅限于流程的特定部分,并在完成后发送一条消息,启动装配线的下一步。
CountDownLatch 和 ExecutorService 提供了一种阻塞方式,直到所有 worker 都完成,如果某个进程已被划分为不同的并发子任务,这可能会派上用场。
JMS 的要点是提供组件间消息传递的方法。它不强制执行特定的并发模型。队列和主题表示消息如何从发布者发送到订阅者。当您使用队列时,消息只会发送给一个订阅者。另一方面,主题将消息广播给该主题的所有订阅者。
可以在单个组件中实现类似的行为,例如使用观察者模式。
ForkJoinPool 实际上是 ExecutorService 的一种实现(这可能突出了匹配模型和实现细节的难度)。它恰好针对处理大量小任务进行了优化。
总结:在Java环境下实现某种并发模型有多种方式。无论选择哪种并发模型,用于实现程序的接口、类 和框架可能会有所不同。
这些模型中的每一个都从一般的角度描述了工作方式 done/splitted,但是在实施方面,这实际上取决于您的具体问题。通常我是这样看的:
- Parallel Workers:生产者在某处创建新作业(例如在
BlockingQueue
中),许多线程(通过 ExecutorService
)处理这些作业平行线。当然,您也可以使用 CountDownLatch
,但这意味着您希望在处理完 N
个子问题后触发一个操作(例如,您知道您的大问题可能会拆分为 N
较小的问题,检查 the second example here).
- 装配线:对于每个中间步骤,您有一个
BlockingQueue
和一个 Thread
或一个 ExecutorService
。在每一步中,作业都从一个 BlickingQueue
中取出并放入下一个,以进行进一步处理。关于 JMS 的想法:JMS 用于连接分布式组件并且是 Java EE 的一部分并且不被认为用于高并发上下文(消息通常在处理之前保存在硬盘上) .
- 函数式并行:
ForkJoinPool
是一个很好的例子,说明如何实现它。
我正在研究多线程环境中的不同并发模型 (http://tutorials.jenkov.com/java-concurrency/concurrency-models.html)
文章重点介绍三种并发模型。
并行工作者
第一个并发模型就是我所说的并行工作者模型。传入的工作分配给不同的 工人。
流水线
工人的组织方式类似于工厂流水线上的工人。每个工人只执行全部工作的一部分。该部分完成后,工作人员将工作转发给下一个工作人员。
每个工人 运行 在自己的线程中,不与其他工人共享任何状态。这有时也称为无共享并发模型。
函数式并行
函数式并行的基本思想是使用函数调用来实现程序。函数可以看作是相互发送消息的“agents”或“actors”,就像在流水线并发模型中一样(又名反应式或事件驱动系统)。当一个函数调用另一个函数时,这类似于发送消息。
现在我要映射javaAPI支持这三个概念
Parallel Workers : 是ExecutorService,ThreadPoolExecutor, CountDownLatch API?
装配线 : 发送一个事件到像JMS这样的消息系统&使用[=43=的消息概念]队列和主题。
函数式并行:ForkJoinPool 在某种程度上 & java 8 个流。 ForkJoin 池相对于流来说很容易理解。
我在映射这些并发模型时是否正确?如果不对请指正。
一个很好的问题,但答案可能不太令人满意。列出的并发模型显示了您可能想要实现并发系统的一些方法。 API 提供了用于实现这些模型的工具。
让我们从 ExecutorService 开始。它允许您提交要以非阻塞方式执行的任务。 ThreadPoolExecutor 实现然后限制可用线程的最大数量。 ExecutorService 不需要任务来执行您可能期望的并行工作进程的完整过程。该任务可能仅限于流程的特定部分,并在完成后发送一条消息,启动装配线的下一步。
CountDownLatch 和 ExecutorService 提供了一种阻塞方式,直到所有 worker 都完成,如果某个进程已被划分为不同的并发子任务,这可能会派上用场。
JMS 的要点是提供组件间消息传递的方法。它不强制执行特定的并发模型。队列和主题表示消息如何从发布者发送到订阅者。当您使用队列时,消息只会发送给一个订阅者。另一方面,主题将消息广播给该主题的所有订阅者。
可以在单个组件中实现类似的行为,例如使用观察者模式。
ForkJoinPool 实际上是 ExecutorService 的一种实现(这可能突出了匹配模型和实现细节的难度)。它恰好针对处理大量小任务进行了优化。
总结:在Java环境下实现某种并发模型有多种方式。无论选择哪种并发模型,用于实现程序的接口、类 和框架可能会有所不同。
这些模型中的每一个都从一般的角度描述了工作方式 done/splitted,但是在实施方面,这实际上取决于您的具体问题。通常我是这样看的:
- Parallel Workers:生产者在某处创建新作业(例如在
BlockingQueue
中),许多线程(通过ExecutorService
)处理这些作业平行线。当然,您也可以使用CountDownLatch
,但这意味着您希望在处理完N
个子问题后触发一个操作(例如,您知道您的大问题可能会拆分为N
较小的问题,检查 the second example here). - 装配线:对于每个中间步骤,您有一个
BlockingQueue
和一个Thread
或一个ExecutorService
。在每一步中,作业都从一个BlickingQueue
中取出并放入下一个,以进行进一步处理。关于 JMS 的想法:JMS 用于连接分布式组件并且是 Java EE 的一部分并且不被认为用于高并发上下文(消息通常在处理之前保存在硬盘上) . - 函数式并行:
ForkJoinPool
是一个很好的例子,说明如何实现它。