出于调试目的,我想找出程序中仍在运行的线程。似乎有一个或多个线程意外地没有被中断。某种漂亮的可打印格式将是一个额外的奖励。
出于调试目的,我想找出程序中仍在运行的线程。似乎有一个或多个线程意外地没有被中断。某种漂亮的可打印格式将是一个额外的奖励。
Map<Thread, StackTraceElement[]> stack = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> entry : stack.entrySet()) {
System.out.println("Thread named '" +
entry.getKey().getName() +
"' is alive");
}
jVisualVM 是针对这种调试情况的好帮手。它位于 JDK 安装目录下的 /bin 目录中。以图形视图显示所有线程,并允许您深入了解它们正在执行的操作。 Thread Dump
按钮将打印出它们的所有当前堆栈跟踪,以便您查看用户代码是否被卡住。
根据nogudnik的回答,tempus-fugit有一个编程线程转储(和死锁检测)功能,请参见http://tempusfugitlibrary.org/documentation/threading/dumps/
似乎有一个或多个线程意外地没有被中断。我不会说事情没有被中断。调用Thread.interrupt()并不能强制可运行的程序停止。它设置了中断标志,并可能导致阻塞操作(如Thread.sleep或java.nio调用)抛出InterruptedException或其他异常(如nio的ClosedByInterruptException)。您的可运行程序必须检查Thread.currentThread().isInterrupted()并表现得友好。
stack.keySet()
而不是获取Entrys
并忽略值。它与你的代码完全相同,但在我看来更清晰(没有必须使用值的感觉...)。 - Andrzej Doyle