我正在从套接字(通过TCP协议(protocol))读取消息,但是我注意到CPU花费大量时间来调用BufferedInputStream的available()方法。这是我的代码:
@Override
public void run()
{
Socket socket;
Scanner scanner;
BufferedInputStream buffer = null;
try
{
socket = new Socket(SERVER_HOST, SERVER_PORT);
System.out.println("Connection Completed");
InputStream inputStream = socket.getInputStream();
buffer = new BufferedInputStream(inputStream);
StringBuilder readCharacter;
while (true)
{
readCharacter = new StringBuilder();
try
{
while (buffer.available() > 0)
{
readCharacter.append((char) buffer.read());
}
}
catch (IOException e)
{
e.printStackTrace();
buffer.close();
}
String array[] = separe(new String(readCharacter));
... //parsing the message
我也尝试过使用int
read=buffer.read()
并检查if (read!=-1)
而不是使用可用的功能,但是在这种情况下,我无法识别消息的结尾...在我的StringBuilder'readCharacter'中,我有多个消息,一个接一个..这会导致我的解析过程失败...而不是使用
available()
检查,进入readCharacter
时,我一次只有一条消息..并且解析有效...您能帮助我理解为什么吗,以及如何避免占用CPU吗?
最佳答案
这个循环:
while (buffer.available() > 0)
{
readCharacter.append((char) buffer.read());
}
可以替换为简单的:
readCharacter.append((char) buffer.read());
而不是一遍又一遍地调用非阻塞
available()
(这会消耗大量CPU),而只是调用read()
,它将阻塞不消耗CPU的内存,直到有可用的东西为止。看起来这是您希望以更少的代码和更少的复杂度实现的目标。