Pal*_*alo 9 java multithreading deadlock stack-trace
我有一个多线程的应用程序.有几条消息即将发送到应用程序,并在分离的线程中处理.为此,我使用包java.util.concurrent中的类ThreadPoolExecutor和FutureTask.
偶尔我在应用程序中有一些死锁.当发生死锁时我想中断阻塞线程,我想记录这个线程的堆栈跟踪,以便以后可以解决死锁.
有什么方法可以在Java中找到该线程之外的线程的堆栈跟踪?
您可以在应用程序中不时地(或在杀死进程之前)记录所有线程的堆栈跟踪.要做到这一点:
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"守护程序线程,然后如上所述记录所有堆栈跟踪.
在进入死锁区域之前,设置一个字段,例如,
thread = Thread.currentThread();
Run Code Online (Sandbox Code Playgroud)
在您的监视线程中,您可以执行thread.getStackTrace(); 随时获取该线程的堆栈跟踪。