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

Java 如何在使用Swing计时器和invokeLater更新Swing组件时防止死锁?,java,swing,timer,deadlock,invokelater,Java,Swing,Timer,Deadlock,Invokelater,如果调用此方法的线程都使用Swing Timer或SwingUtilities.invokeLater(),则更新某些Swing组件的任意同步方法是否会发生死锁。我认为没有必要在Swing计时器任务中调用invokeLater() 因此,我将有一些Swing计时器和一些观察员来更新我的组件。所有观察者都调用调用调用器(),Swing定时器直接调用我的任意方法updateComponents() 如果它仍然会导致死锁,那么invokeLater()会确保不会发生死锁吗?由Swing计时器触发的操作

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

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


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

由Swing计时器触发的操作以及提交给
invokeLater
的可运行程序都会在事件调度线程上按顺序执行,只要不涉及
invokeAndWait
,没有其他线程正在等待操作完成。因此,仅此使用模式不会导致死锁。如果确实遇到死锁,则原因与EDT及其事件处理无关

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