2013-05-10 60 views
-1

我們注意到我們的應用程序在Linux中消耗了99%的CPU週期,並且我們發現一個運行在無限循環中的線程會導致此問題。我們注意到了一個奇怪的行爲。根據參數,此線程計劃一個計時器任務。如果計劃任務計時器,則CPU使用率降至20%。如果不是預定的CPU使用率是100%。只是很想知道如何引入另一個處理線程將CPU使用率降低到10-20%。Java應用程序消耗更多CPU週期

public void run() 
    { 
     log.info("Starting VCMG Channel Thread..."); 
     while (true) { 

      if (readPacket()) { 

       LoyaltyMessageHandle mh = null; 

       synchronized(this) 
       { 
        if(map.containsKey(respSTAN)) 
        { 

         mh = (LoyaltyMessageHandle) map.get(respSTAN); 
         mh.setLoyaltyResp(loyaltyObject); 
         resetHeartBeatTimer(); 
        } 
        else 
        { 
         //Just drop the packet on the floor... It probably timedout. 
         if (!log.isDebugEnabled()) 
         { 
          log.warn("Packet: [" + new String(loyaltyObject).substring(0,28) + 
           "...] DROPPED !!!!!"); 
         } 
         else 
         { 
          log.debug("Packet: [" + new String(loyaltyObject) + "] DROPPED !!!!!"); 
         } 
        } 
       } 

       if(mh != null) { 
        synchronized(mh) { 
         mh.notify(); 
        } 
       } 
      } 
     } 

    } 

public synchronized void resetHeartBeatTimer() 
    { 
     if (heartBeatTimer != null) 
     { 
      heartBeatTimer.cancel(); 
     } 
     startHeartBeat(); 
    } 

public synchronized void startHeartBeat() 
    { 
     heartBeatTimeOut = loyaltyMgr.getHeartBeatInactiveTimer() * 1000; 

     // Timeout value zero indicates that the 'heartbeat' needs to be disabled. 
     // If the timeout value is less than zero that should be ignored since that will cause exception. 
     if ((heartBeatTimeOut > 0) && (this.clientSocket.isConnected())) 
     { 
      if (heartBeatTimeOut < HEART_BEAT_LOWEST_TIMEOUT) 
      { 
       heartBeatTimeOut = HEART_BEAT_LOWEST_TIMEOUT; 
      } 
      heartBeatTimer = new HeartBeatTimer(this, loyaltyMgr.getHeartbeatTimeout()); 
      Timer timer = new Timer(); 
      timer.schedule(heartBeatTimer, heartBeatTimeOut); 
     } 
    } 
+2

你應該看看代碼。或者讓我們來。 – 2013-05-10 06:43:29

+0

沒有看到代碼,除了做出野蠻的猜測之外,我沒有看到我們如何幫助你。 – Mat 2013-05-10 06:43:35

+0

要麼你設計你線程繁忙的循環或你沒有。如果你沒有,這是一個錯誤,你應該修復它。 – 2013-05-10 06:50:37

回答

4

因爲如果一個循環,沒有「休眠」緊運行,那麼它只是使用CPU

如果你把睡眠中或以其他方式爭可能與線程,則CPU不使用

您的計時器必須在熟睡中進行循環,所以它使用較少的CPU時間

+0

是這就是發生了什麼,一個循環無限期地運行導致此問題。這可以通過添加睡眠來解決。調度計時器任務產生一個新的線程,這也將消耗CPU週期。但我不確定計劃任務的CPU使用率如何下降。 – user2368910 2013-05-10 06:58:06