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



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

因此,我将有一些Swing定时器和一些观测器来更新我的组件。观察器都调用invokeLater(),Swing Timers直接调用我的任意方法updateComponents()

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

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

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

最新更新