gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:27:19 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com