gpt4 book ai didi

java - BufferedInputStream available() 占用 CPU

转载 作者:可可西里 更新时间:2023-11-01 02:37:35 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com