使用swing定时器和invokeLater更新Swing组件时如何防止死锁?

时间:2013-12-15 13:08:51

标签: java swing timer deadlock invokelater

如果调用此方法的线程都使用Swing Timer或SwingUtilities.invokeLater(),则可以更新某些Swing组件的任意同步方法发生死锁。我认为没有必要在Swing Timer任务中调用invokeLater()。

所以我会有一些Swing计时器和一些更新我的组件的观察者。观察者全部调用invokeLater(),Swing Timers直接调用我的任意方法updateComponents()

如果它仍然可能导致死锁,invokeLater()是否会确保不会发生死锁?

1 个答案:

答案 0 :(得分:2)

Swing Timer触发的动作以及提交给invokeLater的runnables都是在Event Dispatch Thread上按顺序执行的,只要你不涉及invokeAndWait,就没有其他线程正在等待一个动作完成。因此,单独使用此模式不会产生死锁。如果确实遇到死锁,则原因与EDT及其事件处理无关。

在任何事件回调中都不需要invokeLater,其中包括提交给Swing Timer的回调,因为它们已经保证在事件调度线程上被调用。