我正在从套接字读取消息(通过TCP协议),但我注意到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?
答案 0 :(得分:3)
这个循环:
while (buffer.available() > 0)
{
readCharacter.append((char) buffer.read());
}
可以用简单的替换:
readCharacter.append((char) buffer.read());
不是一遍又一遍地调用非阻塞available()
(消耗大量CPU),而是调用read()
,这将阻止不使用CPU,直到某些东西可用。看起来这是您希望以更少的代码和复杂性实现的目标。
答案 1 :(得分:1)
available()
本身不吃CPU。你的循环是什么:
while (buffer.available() > 0) {
readCharacter.append((char) buffer.read());
}
当字节不可用时,您实际上多次调用available()
(可能数千次)。由于流的read()
方法阻塞,因此您根本不必调用available()
。以下代码执行相同但不占用CPU。
String line = null;
while ((line = buffer.read()) != null) {
readCharacter.append(line);
}