Fork-Join线程池中的长时间运行任务是否可以阻止所有线程?

时间:2018-02-01 06:12:43

标签: java multithreading java-8 java-stream forkjoinpool

我一直在学习Java 8的并行流,而this article出现在Google搜索的第一页上。我无法理解文章中的这一特定内容

  

...所有并行流使用公共的fork-join线程池,如果你   提交一个长期运行的任务,你有效地阻止所有线程   池。

我无法弄清楚长时间运行的任务如何阻止池中的所有其他线程。

2 个答案:

答案 0 :(得分:7)

在本声明中,“提交长时间运行的任务”意味着“使用并行流执行长时间运行的任务”。它是并行流处理的意图,用于拆分工作并分配到公共​​线程池的所有工作线程。

此池有多个线程配置为使用所有CPU核心,如果所有核心都忙,则已达到该目标。

如果这些线程通过等待I / O操作完成而阻塞,则会出现问题。然后,不使用CPU内核,这不仅会降低其他并行流的性能,即使在同一操作中,最佳并发I / O操作数也可能与CPU内核数完全不同。

结论是Stream API不适合并行I / O操作。

答案 1 :(得分:1)

提交一个任务不能使用公共池中的所有线程。 common-pool size是core count -1(主线程为-1)。

我认为在文章中,他认为不可能(在API中)将io密集型任务和cpu密集型任务分离到不同的池中。
例如,在8核计算机上,如果向池中提交8个cpu密集型任务,那么8个io密集型任务,io任务必须等待cpu密集型任务完成(反之亦然)。如果你可以将它们提交到不同的池,那么所有16个操作可以同时运行,因为操作在cpu上并不昂贵。