簡體   English   中英

Java ForkJoinPool中的某些線程偶爾會變為空閑狀態

[英]Some threads in Java ForkJoinPool become idle once in a while

我有一個類似下面的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%。

奇怪的是,每隔幾分鍾左右,除了2個線程(或有時1個)達到100%之外,所有線程的CPU util都降至0%。 大約一分鍾之后,所有人都會再次以70-80%的速度哼唱。 此行為每隔幾分鍾左右重復一次。

我無法確定導致這種情況的原因。 任何想法都會有所幫助。

不一定要在不同的CPU線程上運行不同的Java線程。 從理論上講,32個Java線程在單個CPU線程上可以平均分配1/32的時間。 如果其他31個CPU線程未使用但仍然可能,那將會有點浪費。

具體如何將任務划分到CPU線程上由調度程序決定 在您的情況下,無論出於何種原因,調度程序都在決定是否需要跨2個CPU線程拆分32個Java線程。

我甚至不知道你將如何開始調試這樣的東西。 它不受你的控制而且(實際上)總是如此,為什么要擔心呢?

您機器上運行的其他東西被確定為具有比您的程序更高的優先級,因此CPU可以切換到該程序而不是您的池任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM