gpt4 book ai didi

java - 无法在java中找到while循环行为

转载 作者:行者123 更新时间:2023-12-02 02:54:41 25 4
gpt4 key购买 nike

在我的应用程序中,我使用了两个 while 循环来读取套接字。 while循环1占用1%的CPU,而while循环2占用100%的CPU。我很困惑。请分享您的宝贵想法。有关更多信息,我在下面添加了两个 while 循环:

While 循环 1:

 while(true) {
String message = onReadFinal(in);
if (message != null) {
synchronized (message) {
System.out.println("Message size:" + message);
}
}
}

private String onReadFinal(DataInputStream in) {
String mess = null;
try{
StringBuilder builder = new StringBuilder();

do {
builder.append(in.readInt());
} while(in.available() > 0);

mess = builder.toString();
} catch(IOException e){ e.printStackTrace(); }
return mess;
}

While 循环 2:

 while(true) {
String message = onRead(in);
if (message != null) {
synchronized (message) {
System.out.println("Message size:" + message);
}
}
}

public String onRead(DataInputStream input) {
String socketmessage = null;
int length;

try {
if(input != null) {
length = input.available();
if(length>0) {
byte[] message = new byte[length];
input.readFully(message, 0, message.length);
socketmessage = new String(message);
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
return socketmessage;
}

此外,如果我执行没有任何语句的无限 while 循环,则会占用 100% 的 CPU。请有人解释一下。

最佳答案

如果一个循环不包含阻塞操作,它总是会占用 100% 的 CPU。

您的第一个循环包含阻塞操作in.readInt()。您的第二个循环还包含潜在的阻塞操作 input.readFully(),但仅当流缓冲区有足够的字节可供读取时才调用它,因此实际上此操作不会阻塞。当没有足够的字节时,循环立即重复非阻塞操作input.available(),没有多大意义。

你最好告诉我们你想要什么。

关于java - 无法在java中找到while循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306123/

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