我們注意到我們的應用程序在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);
}
}
你應該看看代碼。或者讓我們來。 – 2013-05-10 06:43:29
沒有看到代碼,除了做出野蠻的猜測之外,我沒有看到我們如何幫助你。 – Mat 2013-05-10 06:43:35
要麼你設計你線程繁忙的循環或你沒有。如果你沒有,這是一個錯誤,你應該修復它。 – 2013-05-10 06:50:37