【问题标题】:Java support for three different concurrency modelsJava 支持三种不同的并发模型
【发布时间】:2015-10-16 02:59:17
【问题描述】:

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

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

  1. 并行工作者

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

  2. 装配线

    工人像工厂流水线上的工人一样组织起来。每个工人只完成全部工作的一部分。当该部分完成后,工人将工作转发给下一个工人。

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

  3. 功能并行

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

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

  1. Parallel Workers:是ExecutorService,ThreadPoolExecutor,CountDownLatch API?

  2. Assembly Line:将事件发送到 JMS 等消息传递系统并使用 Queues & Topics 的消息传递概念。

  3. 功能并行ForkJoinPool 在某种程度上 & java 8 流。与流相比,ForkJoin 池更容易理解。

我在映射这些并发模型时是否正确?如果不是请纠正我。

【问题讨论】:

    标签: java multithreading executorservice countdownlatch forkjoinpool


    【解决方案1】:

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

    让我们从 ExecutorService 开始。它允许您提交要以非阻塞方式执行的任务。 ThreadPoolExecutor 实现然后限制可用的最大线程数。 ExecutorService 不需要任务来执行您可能期望的并行工作程序的完整过程。任务可能仅限于流程的特定部分,并在完成后发送一条消息,开始装配线的下一步。

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

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

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

    ForkJoinPool 实际上是 ExecutorService 的一种实现(这可能突出了匹配模型和实现细节的难度)。它恰好针对处理大量小任务进行了优化。

    总结:在Java环境中实现某种并发模型有多种方式。无论选择何种并发模型,用于实现程序的接口、类和框架可能会有所不同。

    【讨论】:

    • 太棒了!请注意,这些模型中的每一个都适合一些不同的用例,可以明智地使用突出显示的 Java util 类来实现。
    【解决方案2】:

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

    1. Parallel Workers:生产者在某处创建新作业(例如在BlockingQueue 中),并且许多线程(通过ExecutorService)并行处理这些作业。当然,您也可以使用CountDownLatch,但这意味着您希望在处理完N 子问题之后触发一个动作(例如,您知道您的大问题可能会拆分为N 较小的问题,请检查@987654321 @)。
    2. 装配线:对于每个中间步骤,您都有一个BlockingQueue 和一个ThreadExecutorService。在每一步中,作业都从一个BlickingQueue 中取出并放入下一个,以进行进一步处理。根据您对 JMS 的想法:JMS 用于连接分布式组件,并且是 Java EE 的一部分,不被认为用于高并发上下文(消息通常在处理之前保存在硬盘上)。
    3. 函数并行ForkJoinPool 是一个很好的例子,说明了如何实现这一点。

    【讨论】:

    • 谢谢。如果您提供一些有关功能并行性的信息,那就太好了。
    • 关于功能并行性,请查看akka.io,为 jvm 构建的最佳基于 Actor 模型的框架。
    • 在他的教程结束时,作者说“我觉得 Java EE 已经没有优势了”。真的是这样吗?这些技术还没有被整合到 Java EE 中吗?或者他们没有任何计划在未来添加?
    • 是否有现成可用于装配线的实用程序?我在网上搜索过,但因为这个模型没有商定的术语,所以我没有得到任何具体的东西。
    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多