我正在从套接字(通过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的内存,直到有可用的东西为止。看起来这是您希望以更少的代码和更少的复杂度实现的目标。

10-02 03:31
查看更多