当前位置: 首页 > 知识库问答 >
问题:

如何检测线程被IO阻塞?

史弘博
2023-03-14

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

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

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

共有2个答案

闻华容
2023-03-14

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

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

JProfiler支持您需要的功能,详细信息显示在:JProfiler 3.1的新增功能

令狐宏浚
2023-03-14
  • 新:线程已创建但尚未处理。
  • RUNNABLE:线程正在占用CPU并处理任务。(由于操作系统的资源分配,它可能处于WAITING状态。)
  • BLOCKED:线程正在等待不同的线程释放其锁以获取监视器锁。JVISULVM将thta显示为监视
  • WAITING:线程正在使用等待、连接或停放方法进行等待。
  • TIMED_WAITING:线程正在使用睡眠、等待、连接或停放方法等待。(与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线程转储分析仪或这个插件TDA

ThreadMXBean

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

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

 类似资料:
  • 问题内容: 我有一个在后台运行的线程正在以阻塞方式从输入设备读取事件,现在当我退出应用程序时,我想正确清理线程,但是我不能只运行pthread_join(),因为该线程由于IO阻塞而永远不会退出。 我如何正确解决这种情况?我应该发送一个pthread_kill(theard,SIGIORM)还是一个pthread_kill(theard,SIGALRM)来中断该块?那两个信号是否正确?还是有另一种

  • 在服务器端,内存消耗正常,线程量约为250个,看起来一切正常。我没有看到任何问题,所以我决定解决服务器端标记为严重的所有问题。 我遇到的第一个是: 检测到阻塞的系统关键线程。这可能导致群集范围内的未定义行为[threadname=tcp-comm-worker,blockedfor=13s] https://yadi.sk/d/mme0xrgi3k6lka 补充:这个问题似乎不是无关紧要的,这个消

  • 我有一个quarkus应用程序,我正在尝试使用Restasured进行测试,但在测试时出现了以下错误: 如果我运行这个应用程序并使用postman手动测试,这似乎不会发生,所以这似乎是一个测试设置的问题。 我的测试如下: 控制器内部: 我的服务: 我的存储库: 我也尝试将完整的测试内容包装在

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。

  • 我们有一个由2个节点a和B组成的集群。 如果我们在节点a上阻止线程的执行(我是通过远程连接到我的VM并放置断点来执行的),那么节点B认为节点a被分段(这是预期的行为)。 在执行上述场景后,节点A上的任何缓存查找都会被卡住,我们永远不会从IGniteCache中获得结果。 我已经编写了一个测试应用程序来重现这个问题。复制这个问题并不困难,但我已经尽力在readme.md中提供了指导 如果你仍然不清楚

  • 夸克有一件事我很难理解。我在Oracle中使用JPA。因此,我有错误IllegalStateExcema:您试图在IO线程上执行阻塞操作。这是不允许的,因为阻塞了IO线程,我在QUUKUS文档中查看了如何在没有这个困难的情况下进行JPA调用。但是所有的例子和文档都使用PostgreSQL或MariaDB与响应客户端。但是我没有找到任何用于经典JDBC客户端的客户端。 我找到了一个部分有效的解决方案