如何获得线程的堆栈跟踪

Pal*_*alo 9 java multithreading deadlock stack-trace

我有一个多线程的应用程序.有几条消息即将发送到应用程序,并在分离的线程中处理.为此,我使用包java.util.concurrent中的类ThreadPoolExecutor和FutureTask.

偶尔我在应用程序中有一些死锁.当发生死锁时我想中断阻塞线程,我想记录这个线程的堆栈跟踪,以便以后可以解决死锁.

有什么方法可以在Java中找到该线程之外的线程的堆栈跟踪?

Bri*_*new 5

请参阅此处了解如何生成堆栈跟踪,包括如何以编程方式执行此操作.从控制台,Ctrl + Break将堆栈跟踪转储到stdout.有关更多详细信息,请参阅此SO问题.

  • 在UNIX环境中,向java进程发送"QUIT"(`kill -QUIT <pid>`)信号也会将堆栈跟踪输出到标准输出. (5认同)

Tho*_*ler 5

您可以在应用程序中不时地(或在杀死进程之前)记录所有线程的堆栈跟踪.要做到这一点:

Map<Thread, StackTraceElement[]> m = Thread.getAllStackTraces();
for(Map.Entry<Thread,  StackTraceElement[]> e : m.entrySet()) {
    log(e.getKey().toString());
    for (StackTraceElement s : e.getValue()) {
        log("  " + s);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行夜间自动化测试时,有时其中一个测试用例会陷入僵局.我添加了一个等待30分钟的"TimeBomb"守护程序线程,然后如上所述记录所有堆栈跟踪.


Pet*_*rey 5

在进入死锁区域之前,设置一个字段,例如,

thread = Thread.currentThread();
Run Code Online (Sandbox Code Playgroud)

在您的监视线程中,您可以执行thread.getStackTrace(); 随时获取该线程的堆栈跟踪。