2

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

我也尝试使用 intread=buffer.read()和 checkif (read!=-1)而不是使用可用函数,但在这种情况下,我无法识别消息的结尾......在我的 StringBuilder 'readCharacter' 中,我有不止一条消息,一条在另一个之后......它导致我的解析过程失败......

而是使用available()检查,进入readCharacter我一次只有一条消息......并且解析工作......

你能帮我理解为什么,以及如何避免 CPU 被吃掉吗?

4

2 回答 2

3

这个循环:

while (buffer.available() > 0)
  {
  readCharacter.append((char) buffer.read());
  }

可以用简单的替换:

readCharacter.append((char) buffer.read());

available()而不是一遍又一遍地调用非阻塞(这会消耗大量 CPU),只需调用read()它将阻塞不消耗 CPU 直到有东西可用。看起来这是您希望以更少的代码和复杂性实现的目标。

于 2011-11-21T09:17:25.433 回答
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);
}
于 2011-11-21T09:19:21.867 回答