我有如下 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/