【问题标题】:How to know if a thread is blocked by Reader.read()?如何知道线程是否被 Reader.read() 阻塞?
【发布时间】:2012-08-10 09:01:39
【问题描述】:

Reader.read()的文档中说

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

read() 没有从流中得到任何东西时,它会阻塞。但是,这种“阻塞”不会将线程变成State.BLOCKEDState.WAITING——当read()等待第一个字符时,线程仍在State.RUNNABLE中,因此我不知道是否线程被read() 阻塞。

那么我怎么知道Reader.read() 是否阻塞了另一个线程的线程?

【问题讨论】:

    标签: java java-io


    【解决方案1】:

    您可以获取 Thread 的堆栈跟踪,并查看它当时正在运行的方法。

    或者我所做的是设置读取开始的时间,当读取完成时会更清楚。我有另一个线程检查这个时间并在时间过长时发出警告。

    【讨论】:

    • 我想让Reader.read() 抛出一个 IOException .. 所以我要做的是启动一个只留在内存中的进程,让 read() 等待,然后,当一切正常时准备好,杀死那个进程。
    • 等待读者超时来假设它已经完成是相当有缺陷的。只有当您的协议很差且无法更改时,您才会这样做。您可以通过关闭()阅读器来触发 IOException。
    • 更好的方法是让协议发送长度或使用终止字符串,以便您知道何时到达终点。如果出现意外延迟,您希望阅读器错误地终止。
    • 这与协议无关。在另一个类的方法中,它使用ProcessBuilder 启动一个进程,然后读取该进程的输出;我能做的就是告诉它应该启动哪个程序。因此,如果我可以启动我的虚拟程序并在正确的时间杀死它,Reader.read 应该抛出 IOException,因为它正在读取的流刚刚消失。 -- 我只想在Reader 尝试读取时发生 I/O 错误。
    • "我只想在 Reader 尝试读取时发生 I/O 错误。"如果这是您想要的,它不清楚您要达到什么目标或为什么要阅读。
    【解决方案2】:

    如果您的阅读将被阻止,为什么不直接与Reader#ready() 联系?

    【讨论】:

    • 因为我无权访问 Reader 实例。
    【解决方案3】:

    只需使用 Socket.setSoTimeout() 设置读取超时并捕获 SocketTimeoutException。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2019-09-26
      • 2014-10-08
      • 1970-01-01
      • 2013-11-16
      • 2012-01-25
      相关资源
      最近更新 更多