我一直在学习Java 8的并行流,而this article出现在Google搜索的第一页上。我无法理解文章中的这一特定内容
...所有并行流使用公共的fork-join线程池,如果你 提交一个长期运行的任务,你有效地阻止所有线程 池。
我无法弄清楚长时间运行的任务如何阻止池中的所有其他线程。
答案 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上并不昂贵。