最近,我将Swing应用程序转换为Webstart。这个过程非常简单,但是我发现在关闭所有窗口之后,我的应用程序的JVM并未终止。线程转储显示有两个非守护程序线程,特别是Swing的EDT,AWT和几个与Websart相关的线程。
实际使用的策略是,每个窗口在创建时都会增加一个计数器,在关闭时会减少一个计数器。默认关闭操作为DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释放所有JNI资源。
当我从bat文件(相同的JAR)启动应用程序时,当所有窗口都关闭时,它可以正常终止,因此我认为问题与Webstart有关。
现在的问题:
另请参阅followup question,以检测Webstart是否已启动该应用程序。
最佳答案
因为WebStart中的错误,所以可以。 WebStart出于与EDT交互的目的而启动了一个“安全线程”。当处理完所有窗口和AWT资源后,此SecureThread会防止Java进程自动终止。
有关更多信息,请参见http://www.pushing-pixels.org/?p=232。