【问题标题】:Is noncontinuous while cycle overhead?循环开销是不连续的吗?
【发布时间】:2019-04-09 21:27:24
【问题描述】:

我有RXTX串行通信示例的sn-p:

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循环如下,系统过载。

        while (true) {
            System.out.print(new String(buffer,0,0));
        }

为什么第一种方法不会产生高负载?我怎样才能使第二个周期不那么渴望 CPU?使用这样的算法是一种好习惯吗?

【问题讨论】:

  • “使用这样的算法是好的做法吗?”那要看。你想在你的循环中做什么?检查IO?如果是这样,轮询,因为它被称为 IO 有缺点。看看这个问题stackoverflow.com/questions/3072815/…

标签: java multithreading inputstream rxtx


【解决方案1】:

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

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

【讨论】:

  • 也称为“忙等待”。
猜你喜欢
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多