BufferedInputStream available () есть процессор - PullRequest
2 голосов
/ 21 ноября 2011

Я читаю сообщения из сокета (через протокол TCP), но отмечу, что процессор тратит много времени на вызов метода available () моего BufferedInputStream.Это мой код:

    @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 у меня только одно сообщение за раз .. и разбор работает ...

Можете ли вы помочь мне понять, почему и как избежать использования процессора?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Этот цикл:

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

можно заменить простым:

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

Вместо того, чтобы снова и снова вызывать неблокирующую available() (которая потребляет много ресурсов ЦП), просто наберите read(), которая будет блокировать неиспользование ЦП, пока что-то не станет доступно. Похоже, это то, что вы хотите достичь с меньшим количеством кода и сложности.

1 голос
/ 21 ноября 2011

Сам 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);
}
...