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

java.io.InputStreamReader.ready() blocks execution

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

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

幸运的是,bufferedReader 有 ready() 方法,它告诉我天气源是否准备就绪,所以我可以不时地调用它来查看天气是否可以从源中读取,如果没有继续做其他工作。 大部分情况下工作正常,但今天我发现了一些奇怪的事情。

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

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

正如下面 "erwin" 所指出的,真正的问题不在 java.io.BufferedReader 而在底层 reader。

构建缓冲 reader 我使用 java.io.InputStreamReader。

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

那么,ready() 方法怎么可能阻塞,如何避免呢?

谢谢。

BufferedReader 中的 ready() 方法不会自行阻塞 - 您可以在 BufferedReader.

的源代码中轻松查看

BufferedReader 块的 ready() 方法的唯一情况是,如果基础 Reader 块中的 ready() 方法(您传递给BufferedReader 的构造函数)。所以你的问题应该改为“[my real Reader class] read() method blocks execution”。

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