Java并行流使用相同的工作线程。

4

这是我的代码:

    list.stream()
        .parallel()
        .map(cpcP -> this.myDao.myOperation(cip, cpcP))
        .collect(Collectors.toList());

myOperation 内部我写了一个日志:

log.debug("{} -> {}", Thread.currentThread().getName(), ...);

我正在获取这些日志:
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
...

看起来它总是使用相同的线程。

有什么想法吗?


1
@markspace 如果启动线程在其他线程开始工作之前完成了它的工作,那么它不会被检测到,第一个线程将继续使用另一个块,因此在最极端的情况下,它可能在其他线程贡献之前完成所有工作。另一个可能的情况是源列表具有有限的并行处理能力,例如使用LinkedList。 - Holger
后者可能就是我想的那个,谢谢 @Holger 的澄清。 - markspace
2
另外一种可能性是其他工作线程正在忙于其他并行操作。 - Holger
4
并иЎҢжөҒдҪҝз”Ёзҡ„жҳҜForkJoinPool.common()пјҢеӣ жӯӨжӮЁзҡ„еә”з”ЁзЁӢеәҸдёӯеҸҜиғҪиҝҳжңүе…¶д»–дҪҝз”ЁиҜҘе…ұдә«жұ зҡ„ең°ж–№пјҢиҝҷж ·жӮЁзҡ„ж“ҚдҪңе°ұеҸӘиғҪиҺ·еҫ—дёҖдёӘзәҝзЁӢгҖӮ - Lino
没错,@Lino说得很对。 - dreamcrash
显示剩余3条评论
1个回答

0

除了表明公共线程池可能会与其他操作并行忙碌的注释之外,还有一些其他原因:

  1. 您将系统属性 java.util.concurrent.ForkJoinPool.common.parallelism 显式限制为 1,从而明确限制池的并行性为 1。

  2. 核心数量非常少(仅为 1 或 2),因为公共池使用 Runtime.getRuntime().availableProcessors() - 1 作为并行性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接