答案 0 :(得分:4)
具有UI启动事件的Java应用程序处理不是“守护程序”线程的线程。也就是说,只要这些线程正在运行,程序就不会终止 - 即使当前没有窗口显示。
菜单上有“退出”命令吗?其Action
应调用System.exit(0)
。
答案 1 :(得分:2)
如果代码中的所有内容都显示正常,则可能是孤立的线程仍在运行。
代码here描述了如何列出当前在JVM中运行的所有线程
或者,您可以使用具有内置探查器的探查器或IDE来查看正在运行的线程。
如果您能在代码完成后告诉我们哪些线程仍在运行,这将有助于回答此问题; 即使您的代码可能是单线程的,JVM中仍可能会运行其他线程,例如垃圾收集线程(虽然GC线程不会阻止JVM退出)
答案 2 :(得分:2)
只要有一个或多个非守护程序线程在运行,Java进程就会保持活动状态。
考虑使用位于Java JDK的bin目录中的JVisualVM并将其附加到Java程序。在那里,您将能够执行活动线程及其状态的分析以及执行线程转储。
答案 3 :(得分:2)
根据您的线程转储,它看起来像正在加载一个Google库(可能是Guice或Guava)。
Thread name: com.google.inject.internal.Finalizer
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
com.google.inject.internal.Finalizer.run(Finalizer.java:114)
如果是这样,那么这个错误可能导致问题:
与终结器线程没有正确释放有关。发布了各种解决方法。