Fork-Join 线程池中的长 运行 任务是否可以阻塞所有线程?
Can a long running task in a Fork-Join thread pool block all threads?
我一直在学习 Java 8 的并行流,this article 出现在 Google 搜索的第一页。我无法理解文章中的这一行
...all parallel streams use common fork-join thread pool and if you
submit a long-running task, you effectively block all threads in the
pool.
我无法弄清楚一个长 运行 任务会阻塞池中的所有其他线程。
提交一个任务不能使用公共池中的所有线程。公共池大小为 core count -1
(主线程为 -1)。
我认为在文章中,他的意思是不可能(在 API 中)将 io 密集型任务和 cpu 密集型任务分开到不同的池中。
例如,在一台 8 核机器上,如果您向池提交 8 cpu 个密集型任务,那么 8 个 io 密集型任务,io 任务必须等待 cpu 个密集型任务完成(反之亦然)。如果您可以将它们提交到不同的池,那么所有 16 个操作都可以 运行 同时进行,因为 io 操作在 cpu.
上并不昂贵
在这条语句中“提交一个long-运行任务”意味着“使用并行流执行一个long-运行任务”。并行流处理的意图,将工作拆分并分配给公共线程池的所有工作线程。
此池中有许多线程配置为利用所有 CPU 个核心,如果所有核心都忙,则已达到该目标。
如果这些线程因等待 I/O 操作完成而 阻塞 ,就会出现问题。然后,CPU 核未被利用,这不仅会降低其他并行流的性能,即使在同一操作中,并发 I/O 操作的最佳数量也可能与并行操作的数量完全不同CPU 个核心。
结论是 Stream API 不适合并行 I/O 操作。
我一直在学习 Java 8 的并行流,this article 出现在 Google 搜索的第一页。我无法理解文章中的这一行
...all parallel streams use common fork-join thread pool and if you submit a long-running task, you effectively block all threads in the pool.
我无法弄清楚一个长 运行 任务会阻塞池中的所有其他线程。
提交一个任务不能使用公共池中的所有线程。公共池大小为 core count -1
(主线程为 -1)。
我认为在文章中,他的意思是不可能(在 API 中)将 io 密集型任务和 cpu 密集型任务分开到不同的池中。
例如,在一台 8 核机器上,如果您向池提交 8 cpu 个密集型任务,那么 8 个 io 密集型任务,io 任务必须等待 cpu 个密集型任务完成(反之亦然)。如果您可以将它们提交到不同的池,那么所有 16 个操作都可以 运行 同时进行,因为 io 操作在 cpu.
在这条语句中“提交一个long-运行任务”意味着“使用并行流执行一个long-运行任务”。并行流处理的意图,将工作拆分并分配给公共线程池的所有工作线程。
此池中有许多线程配置为利用所有 CPU 个核心,如果所有核心都忙,则已达到该目标。
如果这些线程因等待 I/O 操作完成而 阻塞 ,就会出现问题。然后,CPU 核未被利用,这不仅会降低其他并行流的性能,即使在同一操作中,并发 I/O 操作的最佳数量也可能与并行操作的数量完全不同CPU 个核心。
结论是 Stream API 不适合并行 I/O 操作。