Java线程:确定哪些线程仍在运行

时间:2010-12-06 23:14:25

标签: java multithreading concurrency

出于调试目的,我想弄清楚我的程序的哪些线程仍在运行。似乎有一个或多个线程意外没有中断。某种漂亮的可打印格式将是一种奖励。

5 个答案:

答案 0 :(得分:5)

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

jstack doc

example

答案 1 :(得分:3)

jVisualVM是您进行此类调试的朋友。它位于JDK安装的/ bin目录中。将所有线程显示为图形视图,并允许您深入了解它们正在执行的操作。 Thread Dump按钮将打印出所有当前堆栈跟踪,以便您可以查看某些内容是否卡在用户代码中。

答案 2 :(得分: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");
}

答案 3 :(得分:1)

按照nogudnik的回答,tempus-fugit有一个程序化的线程转储(和死锁检测)功能,请参阅http://tempusfugitlibrary.org/documentation/threading/dumps/

答案 4 :(得分:0)

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