我有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
方法可以读取一些字符数)并且在读取之间可能会有一些延迟。
如果你知道即将到来的流不会那么快,它会耗尽你的应用程序的资源,你的例子中使用的方法是正确的。