Java ForkJoinPool中的某些线程偶尔会变为空闲状态

时间:2017-07-31 16:42:29

标签: 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 util都会下降到0%,除了2个线程(或有时1个)达到100%。大约一分钟之后,所有人都会再次以70-80%的速度哼唱。这种行为每隔几分钟就会重复一次。

我无法确定导致此问题的原因。任何想法都会有所帮助。

2 个答案:

答案 0 :(得分:0)

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

任务分配到CPU线程的确切方式是scheduler。在您的情况下,无论出于何种原因,调度程序都在决定是否需要跨2个CPU线程拆分32个Java线程。

我甚至不知道你将如何开始调试这样的东西。它不受你的控制而且(实际上)总是如此,为什么要担心呢?

答案 1 :(得分:0)

您的计算机上运行的其他内容确定具有比您的程序更高的优先级,因此CPU可能会切换到该程序而不是您的池任务。