我在维护的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.EventQueue
并Toolkit.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启动一个新线程(我认为?)。当我按原
问题内容: 我正在开发Java Swing应用程序,但也希望将JavaFX与Swing一起使用。是否有任何资源可以告诉您如何执行此操作? 问题答案: 看这里。简而言之,现在可以将JavaFX嵌入到Swing中,并且可以通过JFXPanel支持,但是不支持其他方向。