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

Swing应用程序中的线程和死锁

申思远
2023-03-14
问题内容

我在维护的Swing应用程序中遇到了僵局,尽管我有一个可行的解决方法,但我不确定我是否了解自己在做什么,还没有隐藏可能弹出的竞争条件稍后再试。

线程跟踪显示死锁发生在两个线程AWT-EventQueue-0和AWT-
EventQueue-1之间。我的第一个问题是,如果其中一个是臭名昭著的事件调度线程。这两个线程在堆栈跟踪的底部都有以下内容:

at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

我认为问题的根源在于应用程序类将域数据与图形组件混合在一起,在这种情况下,两个线程都试图锁定a
java.awt.Component$AWTTreeLock和我自己的对象之一(比如X)。我的解决方法是SwingUtilities.invokeLater()在X锁定的地方使用,即使X已经在EDT上了。根据Javadoc,这意味着调用“推迟到所有未决事件都已处理完为止”。但是,我不太确定这是否是解决方案,无论如何我都不清楚为什么似乎有两个EDT。

谁能解释发生了什么?我可以尝试提供该代码的简化版本,但可能要花一些时间才能编辑出无关紧要的并发症。


问题答案:

感谢Yishai为我指出正确的方向。该应用程序实例化其自己的子类,java.awt.EventQueueToolkit.getDefaultToolkit().getSystemEventQueue().push(newQueue)用于替换原始队列。AWT- EventQueue-0在事件开始到达线程上的新队列的同时,原始队列仍必须在其线程上处理任务AWT-EventQueue-1,从而导致死锁。



 类似资料:
  • 问题内容: 我试图通过使用JInternalFrame附加JFXPanel来使用JavaFx 2.x和Swing应用程序 我的代码如下 我有这个例外 就我的目的而言,我必须使用JInternalFrame:如何解决此问题? 问题答案: 请参阅“ Swing中的JavaFX”教程。您正在执行应在Swing线程(事件调度线程)上的JavaFX线程上运行的JavaFX操作。 幸运的是,他们从以前的错误中

  • 我正试图通过使用一个JInternalFrame来使用JavaFx2.x和Swing应用程序,其中附加了一个JFXPanel 我在下面的代码 我有这个例外 对于我的目的,我必须使用JInternalFrame:我如何解决这个问题?

  • 问题内容: 我的应用程序正在发生什么是有道理的,但我不知道如何解决。这是我的应用程序的简要说明:计时器窗​​口应显示在屏幕的右下角,并显示实时时间。一个小时后,它应该执行一些操作(我还没有决定要执行的操作)。我面临的问题是,在 Timer.java中, 当我刷新实时计时器的秒数时,我正在使用线程睡眠,这阻止了我的所有应用程序继续执行,因此没有窗口显示。 这是带有一些注释的代码: TimerFram

  • 还有,我应该什么时候关闭executor服务? 我是新的纺纱线程这种方式,有人能帮助我了解它是如何工作的吗?

  • 问题内容: 我知道我知道,到处已经有上百万个问题和答案。关于它的大量真正详尽的文章,几种示例。我已经花了几个小时阅读有关它的信息,但这并不能解决问题。我之所以这样问,是因为我仍然不安静地理解我需要做的事情,显然是因为我的代码仍然无法正常工作。我想到了Swing如何与EDT一起工作,并且如果要使用ServerSocket的accept()方法,我将需要为Swing启动一个新线程(我认为?)。当我按原

  • 问题内容: 我正在开发一个简单的应用程序来使用Swing管理业务的运营部分,但是我需要在应用程序退出时执行以下操作: 但是我该怎么办呢? 问题答案: 适用于任何Java应用程序(Swing / AWT / Console)