我在这里看到@Tej Kiran 提出的一个问题,这正是我的问题,但没有得到回答,最后一条评论说:
“您知道您的应用程序中是否注册了任何关闭挂钩,或者您正在使用的任何库是否有关闭挂钩?关闭挂钩是一个线程,如果该线程中存在死锁导致它永远不会终止,JVM 将永远不会退出。”
我的程序中有一个方法关闭挂钩
Runtime.getRuntime().addShutdownHook(new Thread("Shutdown Hook") {
@Override
public void run() {
System.out.println("---------------");
System.out.printf("%d threads running%n", Thread.activeCount());
Map<Thread, StackTraceElement[]> threads = Thread
.getAllStackTraces();
for (Entry<Thread, StackTraceElement[]> e : threads.entrySet()) {
Thread t = e.getKey();
System.out.printf("%s\t%s\t%s%n", t.getName(),
t.isDaemon(), t.isAlive());
StackTraceElement[] elements = e.getValue();
for (StackTraceElement trc : elements) {
System.out.println("\t" + trc);
}
}
System.out.println("---------------");
try {UIUtil.cancelAllTasks();} catch (Throwable e) {e.printStackTrace();};
try {mehad.io.port.ScannerManager.disableAutoHandshake();} catch (Throwable e) {e.printStackTrace();};
try {mehad.io.port.ComPortInterface.getInstance().close();} catch (Throwable e) {e.printStackTrace();};
try {
if (lockStream != null) {
lockStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
但是我不知道如何区分我的关闭挂钩中是否存在死锁,如果有,如何解决。