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

标签 java multithreading executorservice countdownlatch forkjoinpool

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

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

  1. 并行 worker

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

  2. 装配线

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

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

  3. 功能并行

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

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

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

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

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

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

最佳答案

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

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

关于Java 支持三种不同的并发模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31627441/

相关文章:

java - 为什么 ExecutorService 从类加载器线程启动时不处理提交的任务?

java - RadixSort 算法运行时

java - 当我从 Java 在 mySQL 中提交时如何知道删除的行数

python - PyQt 崩溃和线程安全

java - Thread.sleep 和重画

multithreading - 从另一个线程修改局部变量是什么意思?

Java:带有 Callables 的 ExecutorService:在循环中重用同一个池?需要关机吗?

java - 如何绕过 Java Web 服务客户端中的证书检查

java - 在 Java 中加入字符串集合的首选习惯用法

java - 通过 ThreadPoolTask​​Executor 或 ThreadPoolExecutorFactoryBean 创建线程池?