3

我有一个如下的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% 的速度嗡嗡作响。这种行为每隔几分钟左右就会重复一次。

我无法确定可能导致这种情况的原因。任何想法都会有所帮助。

4

2 回答 2

0

在你的机器上运行的其他东西被确定为比你的程序具有更高的优先级,因此 CPU 可能会切换到那个而不是你的池任务。

于 2017-07-31T16:53:30.230 回答
0

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

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

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

于 2017-07-31T16:51:36.850 回答