我一直在阅读关于并行流的article。这是漫长的啰嗦,我理解了与并行流如何工作有关的一切。我将引用我难以理解的部分:
“并行化需要: 用于执行子任务的线程池, 将初始任务划分为子任务, 将子任务分发给线程, 整理结果。 没有输入细节,所有这些都意味着一些开销。它会在以下情况下显示出惊人的效果:
某些任务意味着长时间阻止,例如访问远程服务,或
同时运行的线程不多,特别是没有其他并行流。
如果所有子任务都意味着强烈计算,则潜在增益受可用处理器数量的限制。默认情况下,Java 8将使用与计算机上的处理器一样多的线程,因此,对于密集型任务,结果高度依赖于其他线程可能同时执行的操作。 当然,如果每个子任务基本上都在等待,那么增益可能看起来很大。“
我不理解上面用粗体突出显示的2个语句。
第一句:某些任务意味着长时间阻塞,例如访问远程服务
我的理解是,与并行处理环境相比,在并发编程环境中执行的相同任务的性能提升会相当相对?
这一个:当然,如果每个子任务基本上都在等待,那么增益可能看起来很大。
我不知道作者在这里的意思。
答案 0 :(得分:1)
任何CPU密集型任务(例如,对数组进行排序)都会占用CPU处理能力的一部分。并行化允许您在多个内核之间分配任务,以便您可以使用系统可用的所有处理能力。但是您的任务必须与还需要同时使用CPU的其他任务,线程池,进程,操作系统等竞争。因此,您可以从处理器中挤出多少计算能力。因此,
当...时会显示惊人的结果。同时运行的线程不多,特别是没有其他并行流。
现在,让我们说你有一个需要进行10次数据库调用的任务。每个调用都需要1秒钟才能使数据库运行查询,收集结果并将结果返回给您。如果在单个顺序线程中运行该任务,则这些数据库调用的执行时间总计最多为10秒,因为每个调用只能在前一个调用完成后运行。在这10秒钟内,您的程序基本上处于空闲状态,只需等待响应即可。
这是并行化真正发挥作用的地方。如果将任务拆分为10个子任务并在自己的线程中运行每个子任务,则每个子任务可以同时提交查询并等待结果,这意味着您只有1秒的停机时间。由于子任务阻止,而不是计算,因此您不受可用系统资源的限制。唯一的限制是您可以在逻辑上分解单个任务的距离。因此,
当某些任务暗示长时间阻塞时会显示出惊人的结果,例如访问远程服务......如果每个子任务基本上都在等待,则增益可能看起来很大。