【发布时间】:2019-09-04 19:34:49
【问题描述】:
我在列表上使用并行流。我想它会使用 WorkJoinPool 来产生多个工作线程,根据日志,不知何故一直只有一个线程:
14:32:14.561 [http-nio-8080-exec-146] INFO from parent_thread
14:32:15.071 [http-nio-8080-exec-146] INFO from first_element_execution
14:32:15.228 [http-nio-8080-exec-146] INFO from second_element_execution
... and so on.
这是我的代码的简短版本:
List<String> myList = ...;
myList.parallelStream().forEach( // Do something and slf4j.log it );
[已编辑] 我在本地机器上尝试了一些非常简单的代码,它确实产生了多个线程。不幸的是,我无法在本地或其他环境中运行生产代码..
为什么我的 parallelStream 不使用 WorkJoinPool 来生成多个线程?
谢谢!
【问题讨论】:
-
并行流不产生线程——它使用普通的 ForkJoinThreadPool,或者(如果当前线程本身在一个 fork-join 池中)——当前线程池。
-
@M.Prokhorov 是的,你是绝对正确的。让我重新提出我的问题。
-
List本身只是一个接口——List的实际实现是什么? -
@Top.Deck。如果池太忙以至于没有其他线程窃取任务(因为他们有自己的并且从不去窃取),那么也可能发生特定请求的所有任务都在同一个线程上处理。
-
@Top.Deck 服务器不一定要超载。 ForkJoinPool 默认有 numCPUs - 1 个线程。因此,当您调用
parallelStream()时,该池中可能只有一个线程可用。如果您需要更多详细信息,可以尝试生成线程转储。
标签: java multithreading java-stream