2017-08-27 4 views
1

Ich verstehe nicht, warum ich 4 Threads haben RUNNING aber nur 50% der Kapazität des Prozessors verwendet: in der Tat, dass Mittelwert ist nur 2/4 Prozessoren verwendet werden.Multithreading und Prozessor Capacity

EDIT: Ich denke, das bis an die Grenze zurückzuführen ist: mein Fehler ist 5 Threads zur gleichen Zeit ausgeführt werden, so standardmäßig begrenzen die Anlage des% CPU auf 2 Kern (50%). Ich werde überprüfen, über 4 Threads

+0

Nicht verwandt: Verwenden Sie nur Tags, die für Ihre Frage relevant sind. Es spielt absolut keine Rolle, welchen IDE-Typ Sie verwenden! – GhostCat

Antwort

1

Dies hängt sehr davon ab, was Ihre Threads sind tun.

Wenn die Arbeit, die sie tun, stark auf IO Operationen konzentriert ist, dann können Ihre CPUs viele viele solche Threads ausführen - ohne jemals zu einer nennenswerten CPU-Last zu kommen.

Mit anderen Worten: Ihre Threads sind wahrscheinlich nicht CPU intensive Arbeit.

Aber wir können nicht sicher wissen, wie Sie sind nicht geben irgendwelche Hinweise über die Art Ihrer Anwendung.

+0

Ich starte 4 Threads "ForkJoinPool". Wenn ein "ForkJoinPool" isDone (Status WAIT) ist, wird "Thread 1" ausgeführt. haben dann alle Tage 4 Themen in State RUNNING Hinweis: Wenn ich 3 Threads "ForkJoinPool" beginnen zur gleichen Zeit, und "Thema 1" wartet, ich habe 75% CPU. –

0

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; 
     } 
    } 
} 
+0

Ich starte 4 Threads "ForkJoinPool". Wenn ein "ForkJoinPool" isDone (Status WAIT) ist, wird "Thread 1" ausgeführt. haben dann alle Tage 4 Themen in State RUNNING Hinweis: Wenn ich 3 Threads "ForkJoinPool" beginnen zur gleichen Zeit, und "Thema 1" wartet, ich habe 75% CPU. –