java - BufferedInputStream available() 吃CPU

标签 java sockets tcp bufferedinputstream

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

相关文章:

ssl - 如何使用 SSL/TLS 设置 JMeter TCP Sampler?

java - Android:如何在 android studio 中配置 FFMPEG 最新版本?

java - 使用正则表达式来匹配内容或分隔符哪个更好?

java - 根据 Combobox 中的选定索引动态更新数据库中的值

java - 多个@Test、Selenium WebDriver 之间的 Get() 和 Set()

node.js - 在断开连接事件中重新连接套接字

Python 套接字实现

java - Python 客户端 Java 服务器 服务器接收到 null

Java Spring-集成TCP刷新控制

c++ - 为什么 connect() 会给出 EADDRNOTAVAIL?