Erstens, es hängt davon ab, wie viele CPU-Kerne haben Sie - wenn Sie mehr CPU-Kerne als laufende Threads haben, dann gibt es nicht genug Threads im Prozessor beschäftigt zu 100% alle Kerne zu halten.
Eine andere Sache ist, dass ein Thread in einem Wartezustand sein kann z. Warten auf Monitor und in diesem Fall verbraucht es nicht die CPU-Zyklen.
In Ihrem Screenshot eines der Themen aus dem Pool befindet sich im Zustand MONITOR - es ist nicht in diesem Moment ausgeführt wird - es für etwas wartet, und als solche nicht CPU-Zyklen verbrauchen.
Ich denke, dass alle Threads in Ihrem Pool sind ähnlich und alle haben die Eigenschaft, einige potenzielle warten auf einem Monitor - und dies begrenzt die Möglichkeit, alle CPU-Kerne bei 100% zu verbrauchen.
Zum Beispiel dieses einfache Programm sollte einfach zu 100% alle Ihre Kerne verbrauchen, weil es keine Warte hat, aber wenn Sie die Zeile Kommentar-, dass es 1 Nanosekunde schlafen befiehlt Thread.sleep(0, 1);
dann werden Sie kaum bemerken cpu Belastung.
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;
}
}
}
Nicht verwandt: Verwenden Sie nur Tags, die für Ihre Frage relevant sind. Es spielt absolut keine Rolle, welchen IDE-Typ Sie verwenden! – GhostCat