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

Java支持三种不同的并发模型,java,multithreading,executorservice,countdownlatch,forkjoinpool,Java,Multithreading,Executorservice,Countdownlatch,Forkjoinpool,我在多线程环境中经历了不同的并发模型() 这篇文章重点介绍了三种并发模型 平行工 第一个并发模型是我所说的并行工作者模型。传入的作业分配给不同的工作人员 装配线 工人像工厂装配线上的工人一样组织起来。每个工人只执行全部工作的一部分。该部分完成后,工人将作业转发给下一个工人 每个工作线程都在自己的线程中运行,并且不与其他工作线程共享任何状态。这有时也称为无共享并发模型 功能并行性 函数并行的基本思想是使用函数调用实现程序。功能可以被视为“代理”或“参与者”,它们相互发送消息,就像在装配线并发模型(

我在多线程环境中经历了不同的并发模型()

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

  • 平行工

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

  • 装配线

    工人像工厂装配线上的工人一样组织起来。每个工人只执行全部工作的一部分。该部分完成后,工人将作业转发给下一个工人

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

  • 功能并行性

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

  • 现在,我想为这三个概念映射JavaAPI支持

  • 并行工作者:是API吗

  • 装配线:使用队列和主题的消息传递概念将事件发送到消息传递系统,如JMS

  • 功能并行性:在某种程度上&java8流。与流相比,ForkJoin池更容易理解


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

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

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

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

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

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

    ForkJoinPool实际上是ExecutorService的一个实现(这可能会突出匹配模型和实现细节的困难)。它只是为处理大量的小任务而进行了优化


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

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

  • 并行工作者:生产者在某处(例如在
    阻塞队列
    中)创建新作业,许多线程(通过
    执行器服务
    )并行处理这些作业。当然,您也可以使用
    倒计时闩锁
    ,但这意味着您希望在处理完
    N
    子问题后触发一个操作(例如,您知道您的大问题可能被拆分为
    N
    小问题,请检查)
  • 装配线:对于每个中间步骤,您都有一个
    阻塞队列
    和一个
    线程
    执行器服务
    。在每个步骤中,作业都从一个
    BlickingQueue
    队列中取出,放入下一个队列,以便进一步处理。您对JMS的想法是:JMS用于连接分布式组件,是JavaEE的一部分,不被认为用于高并发上下文(消息通常在处理之前保存在硬盘上)
  • 功能并行性
    ForkJoinPool
    是一个很好的例子,说明了如何实现这一点

  • 谢谢如果您能提供一些关于功能并行性的信息,那就太好了。关于功能并行性,请查看为jvm构建的基于模型的最佳参与者框架。在他的教程的最后,作者说“我觉得Java EE不再具有优势”。真的是这样吗?这些技术还没有融入JavaEE吗?或者他们没有任何计划在未来增加?有没有一个实用工具,我可以使用现成的装配线?我在网上搜索过,但是因为这个模型没有约定的术语,所以我无法得到任何具体的东西。太棒了!请注意,这些模型中的每一个都适合一些不同的用例,可以明智地使用突出显示的JavaUtil类来实现这些用例。