2013-12-08 57 views
1

我目前正在開發Java服務器應用程序並出現問題。
在我的Server類中,我有一個很大的while循環,它不斷檢查任何客戶端是否有要讀取的數據或數據是否可以發送到任何客戶端。服務器應用程序:減少主循環中的CPU使用率(檢查數據是否可用等)

這個while循環使用了很多CPU,我想減少它。
直到現在我只能通過讓線程在每個週期結束時睡眠1ms來減少它,但這不是我猜測的最佳實踐。
我想我可以設置一個Queue,它包含所有應發送的包,然後使用wait/notify方法。
但我不知道如何做到這一點(或其他)讀取,如果任何客戶端有數據要閱讀。

目前,我這樣做是爲了檢查是否有任何數據是可用的:

while(true){ 

    /* Do some stuff */ 

    try { 
     if(client.getSocket().getInputStream().available() > 0){ 
      if(client.getSocket().getInputStream().read(client.getReadBuffer()) == 1){ 
       PacketHandler.handlePacket(client, client.getReadBuffer()[0], this); 
      } 
     } 
    } catch (IOException e) { 
     LOG.fine("Exception while reading data."); 
     LOG.fine(e.getMessage()); 
     disconnectClient(client); 
    } 

    /* Do some stuff */ 
} 

任何建議如何我能做些什麼/尋找什麼?

回答

0

是的。使用Thread.yield(),然後client.getSocket().getInputStream().available()方法告訴你究竟有多少個字節可以不阻塞地讀取。閱讀那麼多,然後呼叫收益率。

相關問題