当前位置: 首页 > 面试题库 >

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

穆鸿卓
2023-03-14
问题内容

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

实际使用的策略是,每个窗口在创建时都会增加一个计数器,在关闭时会减少一个。默认关闭操作为DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释放所有JNI资源。

当我从bat文件(相同的JARs)启动应用程序时,当所有窗口都关闭时,它可以正常终止,因此我认为问题与Webstart有关。

现在的问题:

  1. 有人可以告诉我到底是怎么回事吗?为什么Webstart会留下僵尸JVM?
  2. 有没有一种方法可以在不停止JVM的情况下显式释放Webstart资源?
  3. 我一直认为,调用System.exit()会鼓励您不要放开资源,而是依靠操作系统来清理您之后的草率做法(如果以后再使用代码,可能会导致令人讨厌的意外)…我错过了什么吗?

问题答案:

因为WebStart中的错误,所以可以。WebStart出于与EDT交互的目的而启动了一个“安全线程”。此SecureThread防止在处置所有窗口和AWT资源时自动终止Java进程。

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



 类似资料:
  • Win32程序通常有一个消息循环,循环调用GetMessage或PeekMessage,然后调用DispatchMessage将消息分派到相关窗口的窗口进程。 但是,真的有必要这样做吗?我是否可以直接在消息循环中查看 MSG 对象,并在其中执行所需的操作,而无需调用 DispatchMessage?我说的是我有一个窗口没有其他窗口控件的情况,例如,如果该窗口仅用作direct3d显示窗口,则消息将

  • 这是我所拥有的:我们有2个应用程序,一个生产和一个消费。两者都运行在不同的JVM上。它们向持久主题发送消息,并使用相同的ClientId。 我想知道在JMS 2.0规范下是否允许这样做,以及在Artemis中这样做是否可以。 在消费方面,我有一个连接工厂 在实例化ActiveMQConnectionFactoryBean时,我通过以下方法在工厂上设置clientID:<code>。setClien

  • 我的问题是:为什么调用不更快或更好,从而更可取?

  • 根据链接中的答案,我知道如果调用SAML local logout(

  • 为了利用的优化,我是否必须显式使用方法(例如等)或调用任何Dataset的方法-甚至类似RDD的方法(例如、等)也允许优化?

  • 我有一个结构,下面的运算符声明: 仅此运算符就可以将不可为null的结构隐式转换为int,但尝试隐式转换其可为null的对应结构仍会引发编译错误: 无法隐式转换类型