如果我在多线程服务器程序中运行并行代码会怎样?

时间:2019-06-28 10:38:25

标签: java multithreading concurrency parallel-processing

我大致了解并行计算和并行计算之间的区别。如果我错了,请纠正我。

并行计算

  

如果系统可以支持两个或多个,则可以说是并行   同时执行的动作。在并行编程中,效率是   主要问题。

并行计算

  

如果一个系统可以支持两个或多个,则称为并发   同时进行的操作。虽然,多个动作不是   必须在并发编程中同时执行。   在并发编程中,模块化,响应性和   可维护性很重要

我想知道如果我在多线程程序中执行并行编程代码会发生什么情况?在多线程服务器程序中使用Java的并行Stream。

该程序实际上会更有效吗?

我最初的想法是,这可能不是一个好主意,因为经过某种方式优化的多线程程序应该已经占用了线程。这里的并行可能会增加额外的开销。

2 个答案:

答案 0 :(得分:2)

并发与并行性之间的关键区别在于,并发是在同一时间处理很多事情(给人一种同时感的错觉),或者处理并发事件本质上是隐藏了延迟。相反,并行是要同时做很多事情以提高速度。

两者都有不同的要求和用例。

并行机制用于实现运行时性能和效率,是的,由于其本质,它将为系统(Cpu,ram等)增加一些额外的开销。但这在当今的多核技术中被大量使用。

答案 1 :(得分:1)

  

我想知道如果我执行并行操作会发生什么   在多线程程序中编程代码?例如使用Java的   多线程服务器程序中的并行流。

基于我对Java运行时的有限了解,每个程序都已经是多线程的,应用程序的入口点是main线程,它与其他运行时线程(gc)一起运行。

假设您的应用程序产生了两个线程,并且在其中一个线程中创建了parallelStream。看起来parallelStreams api使用ForkJoinPool.commonPool,它启动NUM_PROCESSES-1个线程。此时,您的应用程序可能具有比CPU多的线程,因此,如果您的parallelStream计算受CPU限制,那么您已经在线程-> CPU上已经超额预定。

https://stackoverflow.com/a/21172732/594589

我对Java不熟悉,但有趣的是parallelStream共享相同的线程池。因此,如果您的程序产生了另一个线程并启动了另一个parallelStream,则第二个parallelStream将与第一个共享底层线程池线程!

根据我的经验,发现重要的是要考虑:

  • 应用程序正在执行的工作负载类型(CPU与IO)
  • 可用的并发原语类型(线程,进程,绿色线程,epoll aysyncio等)
  • 您的系统资源(即#CPU可用)
  • 您的应用程序并发原语如何映射到底层OS资源
  • 您的应用程序在任何给定时间具有的并发原语数
  

该程序实际上会更有效吗?

这完全取决于,唯一可以肯定的答案是使用这两种解决方案对目标体系结构/系统进行基准测试。


根据我的经验,在基本模式之外进行复杂并发的推理变得很困难。我相信这是俗话:

  

使其正常运行,使其正确,快速。
  -肯特·贝克

来自。在这种情况下,请确保您的程序是并发安全的(正确的)并且没有死锁。然后开始测试,基准测试和运行实验。

在我有限的个人经验中,我发现分析在描述应用程序工作负载(CPU与IO)并找到一种建模方法方面大为不足,因此您可以按可配置的基准测试能力扩展利用系统的全部资源