当前位置: 首页 > 面试题库 >

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

何向荣
2023-03-14
问题内容

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

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

  1. 平行工人

第一个并发模型是我所说的并行工作器模型。进来的工作分配给不同的 工人

  1. 流水线

工人的组织就像 工厂 中装配线的工人一样。每个工人仅完成全部工作的一部分。完成该部分后,工人会将工作转发给下一个工人。

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

  1. 功能并行

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

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

  1. 并行工作者 :是ExecutorService,ThreadPoolExecutor,CountDownLatch API吗?

  2. 组装流水线* :使用 队列和主题的 消息概念将事件发送到 JMS 等消息系统。 *

  3. 功能并行性 :ForkJoinPool在某种程度上与Java 8流有关。与流相比,ForkJoin池易于理解。

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


问题答案:

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

  1. 并行工作者 :生产者在某个地方(例如,在中BlockingQueue)创建新的工作,并且许多线程(通过ExecutorService)并行处理这些工作。当然,您也可以使用CountDownLatch,但是这意味着您想在完全解决了N子问题之后触发一个操作(例如,您知道大问题可能会分解为N小问题,请在此处查看第二个示例)。
  2. 装配线 :对于每个中间步骤,您都有一个BlockingQueue和一个Thread或一个ExecutorService。在每个步骤中,作业都从一个步骤中取出,BlickingQueue然后放入下一个步骤中,以进行进一步处理。对于JMS,您的想法是:JMS可以连接分布式组件,并且是Java EE的一部分,不被认为是在高并发上下文中使用的(消息通常在处理之前保存在硬盘上)。
  3. 功能并行ForkJoinPool是如何实现此 功能的 一个很好的例子。


 类似资料:
  • 我已经开始了一个使用SpringWebFlux的新项目,我对这种反应式编码范式还相当陌生。所以像新手一样提前道歉。 我的控制器方法将响应返回为

  • 本文向大家介绍Java 高并发十: JDK8对并发的新支持详解,包括了Java 高并发十: JDK8对并发的新支持详解的使用技巧和注意事项,需要的朋友参考一下 1. LongAdder 和AtomicLong类似的使用方式,但是性能比AtomicLong更好。 LongAdder与AtomicLong都是使用了原子操作来提高性能。但是LongAdder在AtomicLong的基础上进行了热点分离,

  • Nacos定义为一个IDC内部应用组件,并非面向公网环境的产品,建议在内部隔离网络环境中部署,强烈不建议部署在公共网络环境。 以下文档中提及的VIP,网卡等所有网络相关概念均处于内部网络环境。 Nacos支持三种部署模式 单机模式 - 用于测试和单机试用。 集群模式 - 用于生产环境,确保高可用。 多集群模式 - 用于多数据中心场景。 单机模式下运行Nacos Linux/Unix/Mac Sta

  • 问题内容: 有谁知道nodejs中的内存和线程模型是什么? 特别是原子吗?它的行为就像是在Java 1.5中,在Java 1.4中,在C中还是根本不存在? 问题答案: 了解节点和V8的交互方式很有用。节点处理来自操作系统的等待I / O或计时器。当节点从I / O或计时器唤醒时,通常会调用一些JavaScript回调。当节点运行这些回调时,控制权将传递到V8,直到V8返回到节点。 因此,如果您这样

  • 下面的内容解释了一个理论上的模型。现代 JavaScript 引擎着重实现和优化了描述的几个语义。 运行时 下图是 JavaScript 运行时的可视化描述: 从图中可以看出,其主要包含了栈、堆、队列等数据结构。 栈 用于函数执行的「调用栈」,英文名为「call stack」。 function foo( b ) { var a = 10;​ return a + b + 11;}​funct

  • 本文向大家介绍Go语言并发模型的2种编程方案,包括了Go语言并发模型的2种编程方案的使用技巧和注意事项,需要的朋友参考一下 概述 我一直在找一种好的方法来解释 go 语言的并发模型: 不要通过共享内存来通信,相反,应该通过通信来共享内存 但是没有发现一个好的解释来满足我下面的需求: 1.通过一个例子来说明最初的问题 2.提供一个共享内存的解决方案 3.提供一个通过通信的解决方案 这篇文章我就从这三