一些Java线程ForkJoinPool在一段时间成为空闲一次

一些Java线程ForkJoinPool在一段时间成为空闲一次

问题描述:

我有象下面这样的Java代码:一些Java线程ForkJoinPool在一段时间成为空闲一次

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%。

奇怪的是,在每隔几分钟左右之后,除2个线程(有时为1)达到100%外,所有线程的CPU利用率降至0%。大约一分钟后,所有人都会以70-80%的速度嗡嗡作响。这种行为每隔几分钟重复一次。

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

+1

多少核心,什么操作系统,你如何监测?给池,CPU绑定或I/O绑定的任务的性质是什么?任务是否正确并行? 除了监控CPU使用率之外,您还应该考虑交换,自愿和非自愿的上下文切换。在Ubuntu上,mpstat会给你提供见解。 – TruckDriver

+0

你能提交整个代码吗?我想重现它 – snovelli

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

任务如何分配到CPU线程的确切方式是下至scheduler。就你而言,无论出于何种原因,调度程序正在决定它需要在2个CPU线程之间拆分32个Java线程。

我甚至不知道你会如何开始调试。它超出了你的控制范围,并且(实际上)总是会是,所以为什么要担心呢?

确定您的机器上运行的其他程序的优先级高于您的程序,因此CPU可能会切换到该程序而不是您的共用任务。