2017-08-27 3 views
1

なぜ私は4つのスレッドが実行されているのか理解していませんが、プロセッサーの容量の50%しか使用されませんでした。MultiThreadとプロセッサーの容量

編集:私はこれが限界によるものだと思う。私のミスは、デフォルトでは、システムは2つのコア(50%)に%のCPUを制限するように、5つのスレッドが同時に実行されています。 私は約4つのスレッドを確認するつもりです

+0

関連性のないもの:あなたの質問に関連するタグのみを使用してください。あなたが使っているIDEの種類は絶対に**ありません**! – GhostCat

答えて

1

これはあなたのスレッドがを実行しているかによってまったく異なります

実行している作業が、IOの操作に集中している場合、CPUはかなりのCPU負荷をかけることなく、多くのスレッドを実行できます。

つまり、あなたのスレッドはではなく、でCPUを大量に使用しています。

ではなく、のように、アプリケーションの性質に関するヒントはありません。

+0

私は4つのスレッド "ForkJoinPool"を開始します。 "ForkJoinPool" isDone(State WAIT)の場合、 "Thread 1"が実行されています。私は同時に3つのスレッド「ForkJoinPool」を起動し、「スレッド1」を待っている、私は75%のCPUを持っている: はその後なかれ州 注意がRUNNINGで4つのスレッドを持っています。 –

0

まず、実行中のスレッドの数よりも多くのCPUコアを使用している場合、プロセッサ内のすべてのコアが100%ビジー状態になるのに十分なスレッドが存在しません。

もう1つのことは、スレッドが待機状態になる可能性があることです。そのような場合にはCPUサイクルを消費しません。

プール内のスレッドの1つが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(State WAIT)の場合、 "Thread 1"が実行されています。 次に実行中のスレッドが4つあります 注:3つのスレッド「ForkJoinPool」を同時に起動し、「スレッド1」が待機しているときは、CPUが75%です。 –