如果调用此方法的线程都使用 Swing Timer 或 SwingUtilities.invokeLater()
,则更新某些 Swing 组件的任意同步方法可能会发生死锁。我认为没有必要在 Swing Timer 任务中调用 invokeLater()。
所以我将有一些 Swing 计时器和一些更新我的组件的观察者。观察者都调用 invokeLater()
,Swing Timers 直接调用我的任意方法 updateComponents()
。
如果仍然会导致死锁,invokeLater()
能否确保不会发生死锁?
最佳答案
由 Swing Timer 触发的操作以及提交给 invokeLater
的可运行对象,都在事件调度线程上按顺序执行,只要不涉及 invokeAndWait
code>,没有其他线程正在等待操作完成。因此,仅此使用模式不会产生死锁。如果确实遇到死锁,原因将与 EDT 及其事件处理无关。
您不需要在任何事件回调中使用 invokeLater
,其中包括提交给 Swing Timer 的事件回调,因为它们已经保证在事件调度线程上被调用。
关于java - 使用 Swing Timer 和 invokeLater 更新 Swing 组件时如何防止死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20594886/