gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:46:23 25 4
gpt4 key购买 nike

我在我维护的 Swing 应用程序中遇到了死锁,虽然我有一个似乎有效的解决方法,但我不确定我是否理解我在做什么,而不仅仅是隐藏了一个竞争条件稍后可能会再次弹出。

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

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

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

谁能解释一下这是怎么回事?我可以尝试提供代码的简化版本,但我可能需要一些时间来编辑掉不相关的并发症。

最佳答案

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

关于java - Swing 应用程序中的线程和死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com