2013-12-15 33 views
0

如果调用此方法的线程全部使用Swing Timer或SwingUtilities.invokeLater(),则可能会出现死锁,用于更新某些Swing组件的任意同步方法。我认为在Swing Timer任务中不需要调用invokeLater()。如何使用swing定时器和invokeLater更新Swing组件时防止死锁?

所以我会有一些Swing定时器和一些更新我的组件的观察者。观察者都致电invokeLater()和Swing定时器直接调用我的任意方法updateComponents()

如果它仍然可以导致死锁,invokeLater()会让我确信没有死锁会发生?

回答

2

由Swing Timer触发的操作以及提交给invokeLater的可运行子程序均在事件调度线程上按顺序执行,只要不涉及invokeAndWait,其他线程都不会等待某个操作完成。因此,单独使用这种使用模式不会产生死锁。如果确实遇到死锁,则原因将与EDT及其事件处理无关。

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