Java并行流总是记录相同的线程ID。

4

我正在使用一个List的并行流。我想它会使用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生成多个线程?

谢谢!


2
并行流不会生成线程 - 它使用公共的ForkJoin线程池,或者(如果当前线程本身在fork-join池中)- 当前线程池。 - M. Prokhorov
@M.Prokhorov 是的,你说得完全正确。让我重新表达我的问题。 - Top.Deck
@kaan 这是一个ArrayList。顺便说一下,这段代码只读取列表。 - Top.Deck
1
如果线程池非常繁忙,以至于没有其他线程窃取任务(因为它们有自己的任务并且从不寻找窃取),那么同一请求的所有任务也可能在同一个线程上处理。 - M. Prokhorov
1
@Top.Deck服务器不一定要超载。ForkJoinPool默认情况下具有numCPUs-1个线程。因此,当您调用parallelStream()时,该池中可能只有一个线程可用。如果需要更多详细信息,可以尝试生成线程转储。 - Ivan
显示剩余4条评论
1个回答

0

这取决于您的生产CPU有多少个核心。您正在使用常见的ForkJoinPool,它由表达式初始化:可用处理器数量-1。因此,这个线程池可能只有一个线程。


由于我没有生产服务器访问权限,我将无法运行jstack来检查线程。不过,我同意你的观点。 - Top.Deck

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