我目前正在开发一个Java服务器应用程序,遇到了一个问题
在我的Server
类中,我有一个大while循环,它不断检查是否有任何客户端要读取数据,或者数据是否可以发送到任何客户端。
这个while循环使用了大量的cpu,我想减少它。
到目前为止,我只能通过在每个周期结束时让线程睡眠1毫秒来减少它,但我想这不是最好的做法
我想我可以设置一个Queue
,它保存所有要发送的包,然后使用等待/通知方法
但如果任何客户端有数据要读取,我不知道如何进行读取(或其他操作)。
目前,我这样做是为了检查是否有任何数据可用:
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 */
}
关于我能做什么/寻找什么,有什么建议吗?
是。使用Thread.yield(),然后client.getSocket().getInputStream().available()
方法告诉您可以在不阻塞的情况下读取多少字节。读那么多,然后叫屈服。