我有一个意想不到的问题。 在我的项目中,我使用java.io.bufferedReader类型的对象来读取一些数据。 它包含readLine()方法,该方法从源代码中读取下一行文本。
但是这个方法的问题是如果source没有准备就会阻止调用此方法的线程的执行,直到source有东西要读。
幸运的是,bufferedReader有ready()方法告诉我天气源是否准备就绪,所以我可以调用它一次,看看天气有什么东西可以从源头读取,如果不继续做其他工作。 它大部分工作正常,但今天我发现了一些奇怪的东西。
在极少数情况下,当我调用ready()方法时,ready方法本身会阻止执行。
所以我很惊讶因为ready()方法只有在绝对确定read *方法不会阻塞的情况下才会返回true。
正如下面的“erwin”所指出的,真正的问题不是在java.io.BufferedReader中,而是在底层读者中。
构建缓冲读者我使用java.io.InputStreamReader。
即使我不创建BufferedReader,但只是直接使用InputStreamReader,如果我调用ready()方法,则调用该方法块。
那么,ready()方法如何阻止,以及如何避免呢?
谢谢。答案 0 :(得分:2)
ready()
中的BufferedReader
方法永远不会自行阻止 - 您可以在BufferedReader的源代码中轻松检查它。
ready()
阻止BufferedReader
方法的唯一情况是,如果基础Reader中的ready()
方法阻塞(传递给BufferedReader构造函数的方法)。因此,您的问题应该更改为“[我的真实读者类] read()方法阻止执行”。
例如,如果您的基础读者是PipedReader
,则可能会出现问题,因为ready()
和read()
方法都是synchronized
。如果一个线程被阻止从PipedReader
读取而另一个线程使用PipedReader.ready()
来检查它是否可以读取,则第二个线程也会阻塞,直到第一个线程上的read()
完成。 / p>