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

jan*_*ith 7 java multithreading

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

NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED

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

ven*_*iac 11

  • 新:线程已创建但尚未处理.
  • 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)
Run Code Online (Sandbox Code Playgroud)

要么

  java.lang.Thread.State: RUNNABLE
          at java.net.SocketInputStream.socketRead0(Native Method)
Run Code Online (Sandbox Code Playgroud)

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

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

ThreadMXBean的

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

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