2012-02-22 10 views
-1

私は2つのスレッドを持っています。私は1つ(SocketThread)を呼び出してから、そのスレッドから別のスレッド( 'ProcessThread')を呼び出しています。私の問題は、実行中にCPU使用率が50%ということです。 ProcessThread runメソッドにTimeUnit.NANOSECONDS.sleep(1)を追加すると、0%になります。これは変更する正しい方法ですか?あるいは、CUP利用を減らすための一般的な助言。以下は Javaスレッド - CPU使用率は高いですか?

は私のコードです:

public class SocketThread extends Thread { 
    private Set<Object> setSocketOutput = new HashSet<Object>(1, 1); 
    private BlockingQueue<Set<Object>> bqSocketOutput; 

    ProcessThread pThread; 

    @Override 
    public void run() { 
     pThread = new ProcessThread(bqSocketOutput); 
     pThread.start(); 
     for(long i=0; i<= 30000; i++) { 
      System.out.println("SocketThread - Testing" + i); 
     } 
    } 

} 

public class ProcessThread extends Thread { 

    public ProcessThread(BlockingQueue<Set<Object>> bqTrace) { 
     System.out.println("ProcessThread - Constructor"); 
    } 

    @Override 
    public void run() { 
     System.out.println("ProcessThread - Exectution"); 
     while (true) { 

      /* 
      try { 
       TimeUnit.NANOSECONDS.sleep(1); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
     } 
    } 
} 
+4

'while(true)'ループで実際に何をしていますか?答えはそれに依存します。 – ARRG

+3

ProcesThreadで無限ループを実行しています。あなたは完全なコアを使用する以外に何を期待していますか? – Mat

+0

実際にループ中に何もしていないのであれば、あなたのCPUはその状態をかなり忙しくチェックしてくれます。あなたがループを掛けたいだけなら、あなたはそれを眠りに任せるべきです。 – deraj

答えて

1

あなたがスレッドを眠っていることにより、「CPU使用率を減らす」ことができますが、それはあなたがそれらのスレッドで行われた作業を取得していないことを意味し、あなたがしている場合(または、それはなってきましたスレッドが完全に実行されるようにするよりも劇的に遅くなります)。それは、数マイルごとに停止してエンジンをオフにすることによって、あなたの車の燃料消費を減らすことができるということです。

通常(マーティン・ジェームズが示唆@として、.Wait()のような、またはあなたの状況にBlockingQueue.take()を)スレッド同期をブロックのいくつかの並べ替えなしで実行されてwhile(true)ループは、コードのにおいで、リファクタリングする必要があるコードを示します。

+0

愛車の類推:) – ARRG

1

ワーカースレッドがtake()を呼び出すことによってブロッキングキューで待機する場合、CPUリソースを消費すべきではありません。

(例のコードが示唆するように)何もしないタイトなループであれば、もちろんリソースを消費します。ループの中でリミッタとして睡眠を呼び出すことは、おそらく最良の考えではありません。

1

あなたは、実行する作業がある限り、CPUを酷使する2つのタイトなループがあります。スリープは、アプリケーションの速度を低下させる(CPU使用率を低下させる)方法の1つですが、望む結果が得られることはめったにありません。

睡眠を主張する場合、睡眠時間を少なくとも20ミリ秒に増やしてそこから調整する必要があります。あなたはまた、タスクのバッチの後に眠って見ることができます。 SocketThreadの印刷ループでも同様のスリープが必要です。

関連する問題