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()
完成。
我有一个意想不到的问题。 在我的项目中,我使用 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()
完成。