gpt4 book ai didi

java - 周期开销是不连续的吗?

转载 作者:行者123 更新时间:2023-12-03 13:08:00 26 4
gpt4 key购买 nike

我有RXTX串行通信示例的片段:

public static class SerialReader implements Runnable {
InputStream in;

public SerialReader(InputStream in) {
this.in = in;
}

public void run(){
byte[] buffer = new byte[1024];
int len = -1;
try {
while ((len = this.in.read(buffer)) > -1){
System.out.print(new String(buffer,0,len));
}
}
catch(IOException e) {
e.printStackTrace();
}
}
}

我想知道关于 while周期。根据我的理解,这种非终止而循环的循环对于系统来说应该是多余的,应该避免。但是当我查看广告任务管理器时,找不到足够的负载。

然后,我按如下所示更改了 while周期,并导致系统过载。
        while (true) {
System.out.print(new String(buffer,0,0));
}

为什么冷杉方法不会产生高负荷?我如何才能使第二个周期让CPU不再那么饿?完全使用此类算法是否是一种好习惯?

最佳答案

in.read(buffer)操作需要一些时间,因为您的程序等待I/O返回下一个字符。

这是所谓的blocking operation。从Javadoc:This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.因此,在这种情况下,循环的每次迭代都不会经常发生,因此不会产生高负载。

正如Mike Robinson所指出的,这种关闭循环也可以称为busy wait

在第二个示例中,while(true)没有等待任何东西。因此,连续迭代之间没有延迟,并且它会产生很高的负载。

当然,如果RXTX发送器非常快,则可能会耗尽CPU/内存资源。在这种情况下,为您的应用程序增加一些内存/CPU限制可能是一个好主意。您还可以按块读取字符(read中有重载的 InputStream 方法,可以读取一定数量的字符),并且可能在读取之间增加一些延迟。

如果您知道即将到来的流不会那么快,以至于会耗尽应用程序的资源,那么您的示例中使用的方法是正确的。

关于java - 周期开销是不连续的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53172713/

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