2012-02-22 136 views
-1

我有兩個線程。我正在調用一個(SocketThread),然後從那個調用另一個線程('ProcessThread')。我的問題是,在執行過程中,CPU使用率爲50%。當我在ProcessThread run方法中添加TimeUnit.NANOSECONDS.sleep(1)時,它減少到0%。這是修改的正確方法嗎?或者一般的任何建議,以減少銀聯的使用。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 2012-02-22 16:14:33

+3

你正在ProcesThread中運行一個無限循環。除了使用完整的內核,你還期望什麼? – Mat 2012-02-22 16:15:01

+0

如果你實際上並沒有在while循環中做任何事情,我可以向你保證你的CPU將非常忙於檢查這個條件,並且相當長一段時間。如果你想讓這個循環只是掛出來,那麼你應該讓它休息一下。 – deraj 2012-02-22 16:16:57

回答

1

可以「降低CPU利用率」由休眠的線程,但是這意味着你沒有得到這些線程所做的任何工作(或者如果你是,它越來越完成速度要比只讓線程完全運行慢得多)。這就好像說你可以每隔幾英里停車並關掉髮動機來減少汽車的燃油消耗。

通常沒有某種阻塞的線程同步的while(true)循環正在運行(如.Wait(),或在您的情況,一個BlockingQueue.take()作爲@馬丁 - 詹姆斯建議)是一個代碼的氣味,並表示應重構代碼。

+0

愛車類比:) – ARRG 2012-02-22 16:22:05

1

如果您的工作線程通過調用take()在阻塞隊列上等待,它不應占用CPU資源。

如果它在一個沒有任何作用的緊密循環中(如示例中的代碼所示),那麼它當然會消耗資源。在循環中調用睡眠作爲限制器可能不是最好的主意。

1

只要有工作要做,你就會有兩個緊密的循環,它們會佔用CPU。沉睡是減緩應用程序速度的一種方式(並降低CPU利用率),但很少有,如果有的話,所需的結果。

如果你堅持睡覺,你需要增加你的睡眠時間至少20毫秒,並從那裏調整。您也可以在一批任務後查看睡眠狀況。您還需要在SocketThread打印循環中進行類似的睡眠。