Java 需要帮助理解一篇关于并行流性能提高的文章吗

Java 需要帮助理解一篇关于并行流性能提高的文章吗,java,multithreading,performance,parallel-processing,java-stream,Java,Multithreading,Performance,Parallel Processing,Java Stream,我一直在读关于平行流的文章。这是一篇冗长的文章,我对平行流的工作原理有一定的了解。我将引用我难以理解的部分: “并行化需要: 执行子任务的线程池, 将初始任务划分为子任务, 将子任务分发到线程, 整理结果。 在不输入详细信息的情况下,所有这些都意味着一些开销。当: 某些任务意味着长时间阻塞,例如访问远程服务,或 没有很多线程同时运行,特别是没有其他并行流 如果所有子任务都意味着高强度的计算,那么潜在的收益将受到可用处理器数量的限制。默认情况下,Java 8将使用与计算机上处理器数量相同的线程

我一直在读关于平行流的文章。这是一篇冗长的文章,我对平行流的工作原理有一定的了解。我将引用我难以理解的部分:

“并行化需要: 执行子任务的线程池, 将初始任务划分为子任务, 将子任务分发到线程, 整理结果。 在不输入详细信息的情况下,所有这些都意味着一些开销。当:

  • 某些任务意味着长时间阻塞,例如访问远程服务,或

  • 没有很多线程同时运行,特别是没有其他并行流

如果所有子任务都意味着高强度的计算,那么潜在的收益将受到可用处理器数量的限制。默认情况下,Java 8将使用与计算机上处理器数量相同的线程,因此,对于高强度任务,结果高度依赖于其他线程可能同时执行的操作。当然,如果每个子任务都是高强度的,那么有意识地等待,收益可能看起来是巨大的。

我不理解上面用粗体突出显示的两条语句

第一句话:有些任务意味着长时间阻塞,例如访问远程服务

我的理解是,相对于并行处理环境,在并发编程环境中执行的相同任务,性能提升将是巨大的

这一个:当然,如果每个子任务基本上都在等待,那么收益可能是巨大的

我不知道作者在这里的意思。

任何CPU密集型任务(例如,排序数组)都会消耗CPU的一部分处理能力。并行化允许您在多个内核之间拆分任务,以便使用系统可用的所有处理能力。但是您的任务必须与其他任务、线程池、进程、操作系统等竞争,这些任务也需要同时使用CPU。因此,处理器的计算能力总是有上限的。因此,

它将显示惊人的结果时。。。没有很多线程同时运行,特别是没有其他并行流

现在,假设您有一个需要进行10次数据库调用的任务。数据库运行查询、收集结果并将其返回给您需要1秒的时间。如果在单个连续线程中运行该任务,则这些数据库调用的执行时间总计将达到10秒,因为每个调用只能在前一个调用完成后运行。在这10秒钟内,您的程序基本上处于空闲状态,除了等待响应之外什么也不做

这就是并行化真正闪耀的地方。如果将任务拆分为10个子任务,并在各自的线程中运行每个子任务,则每个子任务都可以同时提交查询并等待结果,这意味着您总共只有1秒的停机时间。因为子任务是阻塞的,而不是计算的,所以您不受可用系统资源的限制。唯一的限制是您可以在逻辑上分解单个任务的程度。因此,

当某些任务意味着长时间阻塞时,例如访问远程服务,它将显示惊人的结果。。。如果每个子任务实际上都在等待,那么收益可能会非常巨大


他们说对于不受计算限制的任务,并行化(或者实际上是并发性)将带来不受计算资源总量限制的性能提升。不,对不起,我还是不明白。当然,这在很大程度上取决于远程服务并行处理这些并行发送的请求的能力。在最坏的情况下,你什么也得不到…