如果调用此方法的线程都使用Swing Timer或SwingUtilities.invokeLater()
,则可以更新某些Swing组件的任意同步方法发生死锁。我认为没有必要在Swing Timer任务中调用invokeLater()。
所以我会有一些Swing计时器和一些更新我的组件的观察者。观察者全部调用invokeLater()
,Swing Timers直接调用我的任意方法updateComponents()
。
如果它仍然可能导致死锁,invokeLater()
是否会确保不会发生死锁?
答案 0 :(得分:2)
Swing Timer触发的动作以及提交给invokeLater
的runnables都是在Event Dispatch Thread上按顺序执行的,只要你不涉及invokeAndWait
,就没有其他线程正在等待一个动作完成。因此,单独使用此模式不会产生死锁。如果确实遇到死锁,则原因与EDT及其事件处理无关。
在任何事件回调中都不需要invokeLater
,其中包括提交给Swing Timer的回调,因为它们已经保证在事件调度线程上被调用。