【问题标题】:setting listener for an input stream in java在java中设置输入流的侦听器
【发布时间】:2022-02-03 15:30:48
【问题描述】:

这只是一个例子。 我有一个输入流,我想为它设置一个监听器。我该怎么做。 第一种方法是创建一个重复检查它的后台线程。

Thread thread = new Thread() {
    public void run() {
        while(true) {
            Thread.sleep(100);
            //optional sleep to avoid wasting cpu cycles
            int c;
            if((c = in.read()) != -1)
                addEventToUIthread(c);
        } 
    } 
} 

但我认为没有 Thread.sleep 会浪费 CPU 周期。 和它;它会降低获取事件的准确性。 假设输入流是一个不可访问的输出流正在写入的文件。 这只是一个示例,说明我不知道此类后台线程的运行时成本。 请解释一下。

【问题讨论】:

  • in.read() 阻塞时是否会浪费 CPU 周期?
  • 正如我之前所说的,这是一个示例,您可能会认为这只是一个条件而不是流。但是 FileInputStream 不会阻塞线程。它将在流结束时返回 -1。
  • 当然它会在流的末尾返回一些东西,否则你永远不会知道你已经到达了终点。但在那之前,read() 方法确实会阻塞线程。 FileInputStream#read()
  • 真;它将很快到达线程的末尾,每当文件增长时,它将读取新内容,否则重复返回-1。
  • 抱歉,我的上一条评论第一行有错别字。编辑“文件结尾”

标签: java multithreading listener cpu inputstream


【解决方案1】:

如果你想立即读取输入字节,你不需要在这里使用 Thread.sleep 来保护 CPU 周期,因为 InputStream.read() 方法是同步运行的,换句话说,它会阻塞直到有一个字节可用。

但是,如果您想在读取数据时故意降低 CPU 使用率,使用 Thread.Sleep 将是正确的方法。

【讨论】:

  • 正如我之前所说的,这是一个示例,您可能会认为这只是一个条件而不是流。但是 FileInputStream 不会阻塞线程。它将在流结束时返回 -1
【解决方案2】:

如果您希望您的程序在文件到达末尾后继续读取文件,在尝试之间没有任何暂停,那么从read() 函数第一次返回 -1 的那一刻起,到新数据到达的那一刻,您的程序将使用所有可用的 CPU 时间,因为它只会往返于 read() 函数,这不是后台操作。

任何其他只包含前台操作的循环也是如此。

【讨论】:

  • 有什么替代方法?
  • 从这个答案 (stackoverflow.com/a/154588/17335001) 或其他人对这个问题的判断来看,我认为每个人最终都会做同样的事情:他们以一种或另一种方式在阅读尝试之间引入了一个小小的停顿。 Thread.sleep() 并不比其他任何方式差,你应该去。
猜你喜欢
  • 2011-08-16
  • 2011-10-20
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多