我是否必须在Webstart应用程序中显式调用System.exit()?

ddi*_*rov 8 java swing java-web-start

最近我将Swing应用程序转换为Webstart.这个过程非常简单,但我发现在关闭所有窗口之后,我的应用程序的JVM没有终止.线程转储显示有几个非守护进程线程,特别是Swing的EDT,AWT和一些websart相关的线程.

使用的实际策略是每个窗口在创建时递增计数器,在关闭时递减1.默认关闭操作是DISPOSE_ON_CLOSE.温计数器达到零,我停止所有线程池并释放所有JNI资源.

当我从一个bat文件(相同的JAR)启动应用程序时,它在所有窗口关闭时终止,所以我认为这个问题与Webstart有关.

现在的问题是:

  1. 谁能告诉我究竟发生了什么?为什么Webstart会离开僵尸JVM?
  2. 有没有办法在不停止JVM的情况下显式释放Webstart资源?
  3. 我一直认为调用System.exit()会鼓励不要释放你的资源并依赖操作系统来清理你(如果你以后重用代码会导致令人讨厌的意外)的草率做法......我错过了什么吗?

另请参阅用于检测Webstart是否已启动应用程序的后续问题.

she*_*non 6

由于WebStart中的错误,是的.WebStart启动了一个"安全线程",用于与EDT交互的自身目的.这个SecureThread可以防止在处理所有窗口和AWT资源时自动终止Java进程.

有关更多信息,请参阅http://www.pushing-pixels.org/?p=232