Java 如何知道某个线程是否被Reader.read()阻塞?

Java 如何知道某个线程是否被Reader.read()阻塞?,java,java-io,Java,Java Io,在Reader.read()的文档中,它说 读取单个字符。此方法将一直阻止,直到字符可用、发生I/O错误或到达流的结尾 当read()。但是,这种“阻塞”不会将线程变成状态。阻塞或状态。等待——线程仍然处于状态。当read()等待第一个字符时,RUNNABLE,因此我无法知道线程是否被read()阻塞 因此,我如何知道Reader.read()是否正在阻止来自另一个线程的线程?您可以获取该线程的堆栈跟踪,并查看它在该点运行的方法 或者我所做的是设置一个开始阅读的时间,当阅读结束时,这个时间会更清

Reader.read()的文档中,它说

读取单个字符。此方法将一直阻止,直到字符可用、发生I/O错误或到达流的结尾

read()。但是,这种“阻塞”不会将线程变成
状态。阻塞
状态。等待
——线程仍然处于
状态。当
read()
等待第一个字符时,RUNNABLE
,因此我无法知道线程是否被
read()
阻塞


因此,我如何知道
Reader.read()
是否正在阻止来自另一个线程的线程?

您可以获取该线程的堆栈跟踪,并查看它在该点运行的方法


或者我所做的是设置一个开始阅读的时间,当阅读结束时,这个时间会更清晰。我有另一个线程,它这次检查并在时间太长时发出警告。

为什么不直接用
Reader\ready()
检查您的读取是否将被阻止?

只要用Socket.setotimeout()设置读取超时并捕获SocketTimeoutException。

我想让
Reader.read()
抛出一个IOException。。所以我想做的是启动一个进程,让它留在内存中,让
read()
等待,然后,当一切就绪时,终止这个进程。等待一个读卡器超时,以为它已经完成了,这是非常有缺陷的。只有当你有一个不能改变的糟糕协议时,你才会这么做。您可以通过关闭读取器()来触发IOException。更好的方法是让协议发送长度或使用终止字符串,以便您知道何时到达末尾。如果出现意外延迟,您希望读卡器错误终止。这与协议无关。在另一个类中的方法中,它使用
ProcessBuilder
启动一个进程,然后读取该进程的输出;我能做的就是告诉它应该启动哪个程序。因此,如果我可以在正确的时间启动我的虚拟程序并杀死它,
Reader.read
应该抛出IOException,因为它正在读取的流刚刚消失。-我只想在
读卡器尝试读取时发生I/O错误。“我只想在读卡器尝试读取时发生I/O错误。”如果这是您想要的,则不清楚您正在尝试实现什么或为什么要读取。因为我没有访问
读卡器
实例的权限。