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

Java 如何检测被IO阻塞的线程?,java,multithreading,Java,Multithreading,在Java中,线程可以有不同的状态: 新建、可运行、阻止、等待、定时等待、终止 但是,当线程被IO阻塞时,其状态为“RUNNABLE”。如何判断它是否被IO阻止? 新建:线程已创建,但尚未处理 可运行: 线程正在占用CPU并处理任务。(由于操作系统的资源分配,它可能处于等待状态。) 阻塞:线程正在等待其他线程释放其锁以获得监视器锁。JVISULVM将thta显示为监控 WAITING:线程正在使用wait、join或park方法等待 TIMED_WAITING:线程正在使用sleep、wait、

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

新建、可运行、阻止、等待、定时等待、终止

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

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

线程转储

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

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

您可以理解java正在等待响应

我建议使用此工具或此插件

ThreadMXBean

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


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

这不是一个聪明的方法,但它是有效的


JProfiler支持您所需的功能,详细信息显示在:

您是指以编程方式?或者你有什么东西卡住了,你正试图弄清楚它是什么?Thread类不提供更多信息,但可能你使用了任何类型的锁(例如j.u.concurrent-package中的ReentrantLock提供了查询队列线程的特殊方法)。@Dimony我正在查看jvisualvm以找出被IO阻塞的区域(寻找提高并发性的机会)。但是IO阻塞的区域显示为“正在运行”,因此我无法区分它。我怀疑没有“已定义”编程方式。你可以在单独的线程中进行I/O,并通过队列进行通信。你可以知道何时在队列中等待。三十年的多线程开发,我从未问过自己或其他人这个问题。如果你不知道,为什么不?谢谢。这是检测IO阻塞的唯一方法吗?第二个line(readBytes或socketRead0)可能并不总是存在,它可能是使用不同库的不同名称。顺便说一句,线程转储只是运行条件的快照。我正在寻找监视线程执行的方法,而不是快照。您可以使用ThreadMXBean来检查某些可运行线程的CPU使用情况。如果您使用weblogic或其他应用程序服务器,请选择其他MBean我可以提供更多信息。问题是:为什么?我的意思是NIO是一个非阻塞IO…谢谢。这给了我一些提示。我正在检查现有的应用程序,所以它可能不使用NIO。那么,你是说,当绑定IO的线程完成其操作系统资源分配部分时,它会进入等待状态?
  java.lang.Thread.State: RUNNABLE
          at java.net.SocketInputStream.socketRead0(Native Method)