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

时间:2014-01-02 20:34:58

标签: java multithreading

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

NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED

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

1 个答案:

答案 0 :(得分:10)

  • NEW:线程已创建但尚未处理。
  • RUNNABLE: 线程占用CPU并处理任务。 (由于操作系统的资源分配,它可能处于WAITING状态。
  • BLOCKED:线程正在等待另一个线程释放其锁定以获取监视器锁定。 JVISULVM显示为监控
  • WAITING:线程正在等待使用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 Analyser或此插件TDA

<强> ThreadMXBean的

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

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