循环开销是非连续的吗?

问题描述 投票:2回答:1

我有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不那么饿?完全使用这些算法是一种好习惯吗?

java multithreading inputstream rxtx
1个回答
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限制可能是个好主意。你也可以读取块中的字符(在read中有超载的InputStream方法可以读取一些字符数)并且在读取之间可能会有一些延迟。

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

© www.soinside.com 2019 - 2024. All rights reserved.