我正在从套接字读取消息(通过 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,直到有东西可用。看起来这就是您想要用更少的代码和复杂性实现的目标。
关于java - BufferedInputStream available() 吃CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8209395/