BufferedInputStream可用()吃CPU

时间:2011-11-21 09:02:18

标签: java sockets tcp bufferedinputstream

我正在从套接字读取消息(通过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?

2 个答案:

答案 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);
}