java - Java ForkJoinPool 中的某些线程偶尔会空闲

标签 java multithreading forkjoinpool

我有如下 Java 代码:

Stream<String> stream = getStreamFromSomewhere()
ForkJoinPool pool = new ForkJoinPool(32);
pool.submit(() -> stream.parallel()
                        .filter(condition)
                        .forEach(x -> recursive(x))).get();
pool.shutdown();

现在,这段代码运行得足够快,使用了我机器中的所有 32 个线程,每个线程的利用率约为 70-80%。

奇怪的是,每隔几分钟左右,所有线程的 CPU 利用率都会下降到 0%,除了 2 个线程(有时是 1 个)会上升到 100%。大约一分钟后,他们再次以 70-80% 的速度嗡嗡作响就可以了。此行为每隔几分钟左右就会重复一次。

我无法确定是什么原因导致的。任何想法都会有帮助。

最佳答案

不同的 Java 线程不一定需要在不同的 CPU 线程上运行。理论上,您的 32 个 Java 线程可以在单个 CPU 线程上平均共享 1/32 的时间。如果其他 31 个 CPU 线程未使用,这会有点浪费,但仍然有可能。

具体如何将任务分配到 CPU 线程上取决于 scheduler 。在您的例子中,无论出于何种原因,调度程序都决定需要将 32 个 Java 线程拆分为 2 个 CPU 线程。

我什至不知道你将如何开始调试类似的东西。它是你无法控制的,而且(实际上)永远都是如此,所以为什么要担心呢?

关于java - Java ForkJoinPool 中的某些线程偶尔会空闲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45421240/

相关文章:

java - 客户端不从套接字读取数据?

java - 将Java连接到MySQL数据库

c# - 映射器使用多线程?

arrays - 使用 .NET 多线程运行同一应用程序的多个实例

Java 支持三种不同的并发模型

java - 建议下载和使用 JDK7 吗?

java - 使用 Optaplanner 7.0.0.Final 时出现 ClassNotFoundException org.reflections.Configuration

android - 为什么 Handler::postDelayed 会使 UI 卡住

java - 如何在 ForkJoinPool 中阻塞队列?

java - ForkJoinPool、Phaser 和托管阻塞 : to what extent do they works against deadlocks?