繁体   English   中英

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

[英]java.io.InputStreamReader.ready() blocks execution

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

但是此方法的问题在于,如果源未准备好,它将阻止调用该方法的线程执行,直到源需要读取某些内容为止。

幸运的是,bufferedReader具有ready()方法,该方法可以告诉我天气源是否准备就绪,因此我可以不时地调用它以查看天气是否有需要从源中读取的内容,以及是否不继续进行其他工作。 它通常可以正常工作,但是今天我注意到了一些奇怪的事情。

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

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

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

构造缓冲的阅读器,我使用java.io.InputStreamReader。

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

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

谢谢。

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

如果底层Reader块中的ready()方法(传递给BufferedReader的构造函数的方法ready() ,则BufferedReader块的ready()方法是唯一的情况。 因此,您的问题应更改为“ [我的实际Reader类] read()方法阻止执行”。

例如,如果您的基础阅读器是PipedReader ,则可能存在问题,因为ready()read()方法都已synchronized 如果一个线程被阻止从PipedReader读取,而另一个线程使用PipedReader.ready()检查是否可以读取,则第二个线程也将阻塞,直到第一个线程的read()完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM