2017-08-27 142 views
1

我不明白爲什麼我有4個線程運行,但只有50%的處理器的容量使用:實際上這意味着只有2/4處理器被使用。多線程和處理器的容量

編輯:我想這是因爲到了極限:我的錯誤是5個線程在同時運行,所以默認情況下,系統的CPU%限制2芯(50%)。 我要檢查約4線程

+0

無關:只使用與您的問題相關的標籤。它絕對不** **你正在使用的IDE類型! – GhostCat

回答

1

這非常取決於你的線程是

如果他們正在從事的工作主要集中在IO操作上,那麼您的CPU可以運行許多這樣的線程 - 而不會導致任何顯着的CPU負載。

換句話說:最有可能的是,你的線程是而不是做CPU密集型工作。

但是我們無法確定,因爲您對不是給出了有關您的應用程序性質的任何提示。

+0

我開始4個主題「ForkJoinPool」。 當「ForkJoinPool」isDone(狀態爲WAIT)時,「線程1」正在運行。 然後一直有4個線程在運行狀態 注意:當我同時啓動3個線程「ForkJoinPool」,並且「線程1」正在等待時,我有75%的CPU。 –

0

首先,它取決於您擁有多少個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; 
     } 
    } 
} 
+0

我開始4個主題「ForkJoinPool」。 當「ForkJoinPool」isDone(狀態爲WAIT)時,「線程1」正在運行。 然後一直有4個線程在運行狀態 注意:當我同時啓動3個線程「ForkJoinPool」,並且「線程1」正在等待時,我有75%的CPU。 –