我有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不再那么饿?完全使用此类算法是否是一种好习惯?
答案 0 :(得分:0)
操作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限制可能是一个好主意。您还可以分块读取字符(InputStream
中有重载的read
方法可以读取一定数量的字符),并且可能在读取之间增加一些延迟。
如果您知道即将到来的流不会那么快,以至于会耗尽应用程序的资源,那么您的示例中使用的方法是正确的。