我不明白爲什麼我有4個線程運行,但只有50%的處理器的容量使用:實際上這意味着只有2/4處理器被使用。多線程和處理器的容量
編輯:我想這是因爲到了極限:我的錯誤是5個線程在同時運行,所以默認情況下,系統的CPU%限制2芯(50%)。 我要檢查約4線程
我不明白爲什麼我有4個線程運行,但只有50%的處理器的容量使用:實際上這意味着只有2/4處理器被使用。多線程和處理器的容量
編輯:我想這是因爲到了極限:我的錯誤是5個線程在同時運行,所以默認情況下,系統的CPU%限制2芯(50%)。 我要檢查約4線程
這非常取決於你的線程是做。
如果他們正在從事的工作主要集中在IO操作上,那麼您的CPU可以運行許多這樣的線程 - 而不會導致任何顯着的CPU負載。
換句話說:最有可能的是,你的線程是而不是做CPU密集型工作。
但是我們無法確定,因爲您對不是給出了有關您的應用程序性質的任何提示。
我開始4個主題「ForkJoinPool」。 當「ForkJoinPool」isDone(狀態爲WAIT)時,「線程1」正在運行。 然後一直有4個線程在運行狀態 注意:當我同時啓動3個線程「ForkJoinPool」,並且「線程1」正在等待時,我有75%的CPU。 –
首先,它取決於您擁有多少個CPU核心 - 如果您的CPU核心多於正在運行的線程,那麼沒有足夠的線程可以使處理器中的所有核心保持100%的忙碌狀態。
另一件事是一個線程可以處於等待狀態,例如。在監視器上等待,在這種情況下它不會消耗CPU週期。
在您的屏幕截圖中,池中的線程之一處於MONITOR狀態 - 此時不執行 - 它正在等待某些內容,因此不會佔用CPU週期。
我認爲您池中的所有線程都是相似的,並且都具有在顯示器上進行一些潛在等待的特性 - 並且這限制了以100%消耗所有CPU核心的可能性。
例如,這個簡單的程序應該消耗100%的所有核心,因爲它沒有任何等待,但是如果取消註釋命令它睡眠1納秒的線路Thread.sleep(0, 1);
那麼您幾乎不會注意到任何cpu加載。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class consumeMaxOfCPU {
public static void main(String[] args) {
int availableProcessors = Runtime.getRuntime().availableProcessors();
// availableProcessors = availableProcessors /2; // uncomment this line to see around half of the load - because there will be less threads than CPU cores.
ExecutorService pool = Executors.newFixedThreadPool(availableProcessors);
for (int n = 0; n < availableProcessors; n++) {
pool.submit(new HeavyTask(n));
}
}
private static class HeavyTask implements Callable<Long> {
private long n;
public HeavyTask(long n) {
this.n = n;
}
@Override
public Long call() throws Exception {
// there are very little chances that this will finish quickly :)
while (n != -10) {
n = n * n;
// Thread.sleep(0, 1); // uncomment this line to see almost no load because of this sleep.
}
return n;
}
}
}
我開始4個主題「ForkJoinPool」。 當「ForkJoinPool」isDone(狀態爲WAIT)時,「線程1」正在運行。 然後一直有4個線程在運行狀態 注意:當我同時啓動3個線程「ForkJoinPool」,並且「線程1」正在等待時,我有75%的CPU。 –
無關:只使用與您的問題相關的標籤。它絕對不** **你正在使用的IDE類型! – GhostCat