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

退出Swing应用程序时偶尔出现InterruptedException

端木志诚
2023-03-14
问题内容

最近,我将计算机更新为功能更强大的计算机,并配备了四核超线程处理器(i7),因此可以使用大量实际并发。现在,我退出()正在开发的应用程序(带有Swing
GUI)时, 偶尔会 遇到以下错误System.exit(0)

Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at sun.java2d.Disposer.run(Disposer.java:125)
        at java.lang.Thread.run(Thread.java:619)

好吧,鉴于它开始使用具有更多并发能力的硬件发生,并且与线程有关,并且偶尔发生,这显然是某种时机。但是问题是堆栈跟踪太短了。我只有上面的清单。它根本不包含我自己的代码,因此很难猜测该错误在哪里。

有没有人经历过这样的事情?任何想法如何开始解决它?

编辑:
由于使用退出Swing应用程序System.exit(0)可能是“不干净的”,但我不想将主机设置为,EXIT_ON_CLOSE因为我想确保退出应用程序时没有发生任何紧急情况,因此我添加了一种机制以使其执行dispose()调用之前的主要框架方法System.exit(0)。因此,它现在应该很干净,但偶尔仍会发生异常。它在System.exit(0)被调用之后发生;dispose()没问题。也就是说,它必须来自关闭钩子:

mainFrame.dispose(); // No problem! After this returns, all visible GUI is gone.
// In fact, if there were no other threads around, the VM could terminate here.
System.exit(0); // Throws an InterruptedException from sun.java2d.Disposer.run

我什至尝试Window通过遍历Window.getWindows()数组来显式处理所有s
(它包含无主Dialogs等),但没有区别。此问题似乎与“清除”没有关系(即在退出之前显式释放本机屏幕资源)。这是另外一回事,但是呢?

编辑2:
将默认关闭操作设置为EXIT_ON_CLOSE无差异。http://www.google.com/search?q=sun.java2d.Disposer.run(Disposer.java:125)发现了一些错误报告,因此也许这确实是Sun的Java2D实现中的错误。我可以想象像这样的错误会在很长一段时间内无法修复,因为实际上它们是无害的。关闭挂钩中的异常几乎不会伤害其他任何人。鉴于这是在GUI应用程序中发生的,除非将该异常stderr定向到控制台或日志,否则甚至不会注意到该异常。


问题答案:

您的处置器在对remove()的调用中被阻止(删除下一个平台本机资源)。这意味着,当VM退出时,处置程序线程(守护程序线程)不会自然关闭(您应该期望这是因为要通过System.exit()终止它)。

您的应用程序中有一个非守护进程线程,当所有摆动窗口都已被处置后,该线程将阻止VM退出。

解决方案 :找到它并使其退出。

通常,如果已清除所有秋千应用程序的秋千应用程序,则该程序会正常退出,例如,此程序将弹出一个窗口,然后在关闭后退出(全部不调用System.exit()):

public static void main(String args[]) throws Exception {
    JFrame jf = new JFrame();
    jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    jf.setVisible(true);
}

您也可以尝试在退出之前运行垃圾收集器,只是为了踢。



 类似资料:
  • 我正在开发移动应用程序与离子有飞溅 截至目前,我正在使用以下代码进行配置 此外,我在第一次启动页面上使用了双击退出,下面是一段代码。 所以在启动页面,若我在5秒内点击两次后退按钮,它就会关闭。我可以在“打开的应用程序”列表中看到应用程序仍处于打开状态。(android手机中的第一个或最后一个按钮)。 问题是,如果我在双击退出后重新启动应用程序,那么它会显示一段时间的白屏和启动屏幕(但没有闪屏)。我

  • 问题内容: 我有一个Swing应用程序,需要在其中显示内部生成的HTML / CSS。为了做到这一点,我改编了这个StackOverflow问题的代码。 该控件工作正常。但是,当应用程序结束时,我收到错误消息 就其价值而言,直接来自Oracle的示例代码(在StackOverflow帖子中引用)具有相同的问题。 我尝试过在窗口关闭时显式调用,但错误仍然存​​在。那么,当JavaFX嵌入到Swing

  • 我们使用Assertj Swing3.9.2进行的gui单元测试偶尔会以难以重现的方式失败。有时整个测试套件是绿色的,有时一些测试用例失败。我们使用Ubuntu18.04LTS和GNOME两台不同的机器,我们得到了相同的错误。 抛出的异常有两个,并不时出现在不同的测试用例中: null null 此外,在不同的测试用例中,重复运行多次相同的测试可能会导致失败或成功。 特拉维斯-奇的测试也失败了。

  • 问题内容: 我正在使用背景音乐创建游戏应用程序。我使用Android Service播放背景音乐是​​因为我想在更改活动时运行BGM。我的问题是,我在每个活动的onPause方法中都声明了finish()(我不想让用户返回并想杀死该活动)。 因此,当我打算进行其他活动时,它将调用onDestroy并停止该服务。我想停止该服务以完全退出应用程序(按下主页按钮),并想要通过onPause()中的BGM

  • 我有一个文件解析器代码,偶尔会在m.matches()上出现堆栈溢出错误(其中m是匹配器)。 我再次运行我的应用程序,它解析相同的文件,没有堆栈溢出。 我的模式确实有点复杂。它基本上是一组可选的零长度正lookahead,其中包含命名组,这样我就可以匹配一组变量名/值对,而不考虑它们的顺序。但我认为,如果某个字符串会导致堆栈溢出错误,它总是会导致它。。。不只是有时候。。。有什么想法吗? 我的模式

  • 我正在使用PDFBox在循环中生成一堆发票。这通常是有效的,但不幸的是,我在循环中不时会遇到以下异常。为失败的发票再次启动生成一两次迟早会创建所有发票。 我已经研究了一些类似的问题,比如这里的PDFbox说PDDocument在未关闭时关闭,我只是认为它与垃圾收集器释放的对象有关,但我没有看到我的代码中的错误。 对于PDF本身的创建,我通常使用ApachePDFBox Cookbook的描述htt