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

时间:2017-01-24 05:05:47

标签: java concurrency bufferedreader blocking

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

但是这个方法的问题是如果source没有准备就会阻止调用此方法的线程的执行,直到source有东西要读。

幸运的是,bufferedReader有ready()方法告诉我天气源是否准备就绪,所以我可以调用它一次,看看天气有什么东西可以从源头读取,如果不继续做其他工作。 它大部分工作正常,但今天我发现了一些奇怪的东西。

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

所以我很惊讶因为ready()方法只有在绝对确定read *方法不会阻塞的情况下才会返回true。

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

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

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

那么,ready()方法如何阻止,以及如何避免呢?

谢谢。

1 个答案:

答案 0 :(得分:2)

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

ready()阻止BufferedReader方法的唯一情况是,如果基础Reader中的ready()方法阻塞(传递给BufferedReader构造函数的方法)。因此,您的问题应该更改为“[我的真实读者类] read()方法阻止执行”。

例如,如果您的基础读者是PipedReader,则可能会出现问题,因为ready()read()方法都是synchronized。如果一个线程被阻止从PipedReader读取而另一个线程使用PipedReader.ready()来检查它是否可以读取,则第二个线程也会阻塞,直到第一个线程上的read()完成。 / p>