0

我的 java 应用程序有 100 多个线程,每个线程都在做类似的事情。使用jstack可以打印所有线程的堆栈,但是信息太多,是否可以打印java的特定线程的堆栈?例如只打印一个java 应用程序的id 为100 的线程。

4

2 回答 2

2

您可以使用ThreadMXBean MBean的getThreadInfo方法。它允许您传递一个线程 ID,它将返回一个ThreadInfo数据类型,其中包含堆栈跟踪、线程状态等。

编辑:我还应该补充一点,如果您正在寻找外部的东西,您可以使用jVisualVM的Threads Inspector插件。它工作得非常好,并允许您选择实时显示堆栈的线程。此外,jVisualVM 是免费的,并且与 JDK 捆绑在一起(例如 JDK_location/bin/)。线程检查器插件也是免费的,可以通过打开 jVisualVM > 工具 > 插件 > 可用插件来安装。

于 2014-07-31T04:56:06.833 回答
1

您可以Thread.getAllStackTraces()用来获取Map所有活动线程的所有堆栈跟踪。搜索Map使用Thread.getId()以查找具有您要打印的线程的 id 的线程。然后Thread.dumpStack()打印该线程的堆栈。

示例代码:

public void printStack(int threadId) {
  for (Thread thread : Thread.getAllStackTraces().keySet()) {
    if (thread.getId() == threadId) {
      thread.dumpStack();
      break;
    }
  }
}
于 2014-07-31T04:59:55.633 回答