【问题标题】:Java Parallel Stream always log same threadIDJava Parallel Stream 总是记录相同的 threadID
【发布时间】: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


【解决方案1】:

这取决于您在生产中的 CPU 有多少个内核。您正在使用由表达式初始化的通用 ForkJoinPool:可用处理器数 - 1。所以这个线程池可能只有 1 个线程。

【讨论】:

  • 由于我没有生产服务器的访问权限,我将无法运行 jstack 来检查线程。不过,我同意你的看法。
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2020-03-07
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多