周期开销不连续吗?

时间:2018-11-06 13:18:11

标签: java multithreading inputstream rxtx

我有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不再那么饿?完全使用此类算法是否是一种好习惯?

1 个答案:

答案 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方法可以读取一定数量的字符),并且可能在读取之间增加一些延迟。

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