2010-12-06 48 views

回答

3

jVisualVM是你的朋友对这种调试。它位于JDK安装的/ bin目录中。将所有线程显示为图形视图,并允许您深入了解他们正在做的事情。 Thread Dump按钮将打印出所有当前的堆栈跟踪,以便您可以查看是否有东西卡在用户代码的某处。

+1

+1 JVisualVM是一个很棒的工具。我更喜欢JConsole来检查单个线程,但JVisualVM的Thread Dump功能非常棒。我希望它可以将它转储到允许文本搜索/突出显示的显示器上。 – 2010-12-06 23:30:16

+0

我使用fgrep来查找文本。例如jstack | fgrep“com.bla.foo” – 2010-12-06 23:41:38

+0

@Tim:是的。我只是将转储复制/粘贴到我的文本编辑器中。 – 2010-12-06 23:52:25

5

使用'jps'命令行工具查看活动java进程和jstack以显示活动线程。

jstack doc

example

3

如果你正在寻找一个纲领性的解决方案,这样的事情(在JDK 1.5或更高版本)应该工作:

Map<Thread, StackTraceElement[]> stack = Thread.getAllStackTraces(); 
for (Map.Entry<Thread, StackTraceElement[]> entry : stack.entrySet()) { 
    System.out.println("Thread named '" + 
         entry.getKey().getName() + 
         "' is alive"); 
} 
0

“似乎有一个或多个线程意外不会中断”。我没有说事情没有中断。调用Thread.interrupt()不会强制runnable停止。它设置中断标志,并可能导致阻塞操作(如Thread.sleep或java.nio调用)抛出InterruptedException或其他异常(如nio的ClosedByInterruptException)。你的runnable必须检查Thread.currentThread()。isInterrupted()并且表现得很好。