如何检测被IO阻塞的线程?

在Java中,线程可以具有不同的状态:

NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED

但是,当线程被IO阻塞时,其状态为“RUNNABLE”。 如何判断它是否被IO阻止?

  • 新:线程已创建但尚未处理。
  • RUNNABLE:线程占用CPU并处理任务。 ( 由于操作系统的资源分配,它可能处于WAITING状态。
  • BLOCKED:线程正在等待另一个线程释放其锁定以获取监视器锁定。 JVISULVM显示为监控
  • 等待:线程正在等待使用wait,join或park方法。
  • TIMED_WAITING:线程正在等待使用sleep,wait,join或park方法。 (与WAITING的区别在于最大等待时间由方法参数指定,WAITING可以通过时间和外部更改来缓解。)
  • TERMINATED:已退出的线程处于此状态。

另见http://architects.dzone.com/articles/how-analyze-java-thread-dumps

线程转储

转储java线程堆栈你可以找到类似的东西

java.lang.Thread.State: RUNNABLE at java.io.FileInputStream.readBytes(Native Method) 

要么

  java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) 

你可以理解java正在等待响应。

我建议使用这个工具Java Thread Dump Analyzer或者这个插件TDA

ThreadMXBean的

Yiu可以使用ThreadMXBean获取更多信息

http://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadMXBean.html

您可以检查线程的statckTraces然后查找最后一个堆栈是否在某种与i / o阻塞相关的特定方法中(例如: java.net.SocketInputStream.socketRead0

这不是一个聪明的方法,但它的工作原理。

JProfiler支持您需要的function,详细信息显示: JPROFILER 3.1中的新function