java.io.InputStreamReader.ready() 阻止执行

标签 java concurrency bufferedreader blocking

我有一个意想不到的问题。 在我的项目中,我使用 java.io.bufferedReader 类型的对象来读取一些数据。 它包含 readLine() 方法,该方法从源中读取下一行文本。

但此方法的问题是,如果源尚未准备好,它会阻止调用此方法的线程的执行,直到源有要读取的内容为止。

幸运的是,bufferedReader有ready()方法,它告诉我天气源是否准备好,所以我可以偶尔调用它来查看天气是否有东西可以从源中读取,如果不继续做其他工作。 它大部分工作正常,但今天我注意到一些奇怪的事情。

在极少数情况下,当我调用ready()方法时,ready方法本身会阻止执行。

所以我很惊讶,因为ready()方法被设计为只有在绝对确定read*方法不会阻塞时才返回true。

正如下面的“erwin”所指出的,真正的问题不在 java.io.BufferedReader 中,而在底层读取器中。

为了构造缓冲读取器,我使用 java.io.InputStreamReader。

即使我不创建BufferedReader,而是直接使用InputStreamReader,如果我调用ready()方法,调用该方法也会阻塞。

那么,ready()方法怎么会阻塞,以及如何避免它呢?

谢谢。

最佳答案

ready() BufferedReader中的方法永远不会自行阻塞 - 您可以在 BufferedReader 的源代码中轻松检查这一点。

唯一的情况是ready()方法BufferedReader block 是,如果 ready()底层 Reader block 中的方法(您传递到 BufferedReader 的构造函数中的方法)。所以你的问题应该改为“[我真正的Reader类] read()方法阻止执行”。

例如,如果您的底层读者是 PipedReader ,可能存在问题,因为 ready()read()方法都是 synchronized 。如果一个线程因读取 PipedReader 而被阻止另一个线程使用 PipedReader.ready()检查它是否可以读取,然后第二个线程也会阻塞,直到 read()第一个线程完成。

关于java.io.InputStreamReader.ready() 阻止执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41820386/

相关文章:

java - 如何使用spring向不同的web服务发送并发请求

java - 在Java中正确地将对象数组输出到.csv文件

java - 多线程写入同一个 boolean 值

java - 从 Java 中的 BufferedReader 对象中提取全部内容的最佳方法是什么?

java - 使用 Java 创建符号链接(symbolic link)

java - 我在spring和freemarker集成中遇到的问题

c++ - 我是否需要使用内存屏障来保护共享资源?

concurrency - 为什么条件变量有时会错误唤醒?

java - 文件读/写正确顺序

java - 将文件中的字符串值转换为整数