SwingUtilities.invokeLater
是什么?它只是延迟执行其 run
方法内的一段代码吗?在 invokeLater
函数中调用操作和仅在要执行的线程末尾调用操作有何区别?请问有谁能帮助我理解 invokeLater
函数的真实作用是什么?
SwingUtilities.invokeLater
是什么?它只是延迟执行其 run
方法内的一段代码吗?在 invokeLater
函数中调用操作和仅在要执行的线程末尾调用操作有何区别?请问有谁能帮助我理解 invokeLater
函数的真实作用是什么?
正如其他答案所说,它在AWT事件分派线程上执行您的Runnable
。但为什么要这样做?因为Swing数据结构不是线程安全的,为了为程序员提供一个易于实现的方法来防止并发访问它们,Swing设计者制定了规则,即所有访问它们的代码必须在同一线程上运行。对于事件处理和显示维护代码,这是自动进行的,但如果您启动了一个长时间运行的操作-当然是在新线程上-如何信号其进度或完成?您必须修改Swing控件,并且必须从事件分派线程中执行此操作。因此使用invokeLater
。
这将在AWT线程上运行代码,允许你从其他线程修改GUI。
来自文档:
导致异步执行doRun.run()在AWT事件调度线程上。在处理完所有待处理的AWT事件后,这将发生。当应用程序线程需要更新GUI时,应使用此方法。
这个应该是评论,但是看起来越来越长了,只是基础的东西。
1/ 创建自己的EDT以确保正确更新GUI。例如,如果您使用普通的Thread,java.util.Timer,Executor等执行一些代码,则需要使用自己的EDT。更多信息请查看此处。
2/ 帮助设置焦点到JComponents,如果有一些监听器,因为如果有例如DocumentListener,那么很难将Focus
设置为所需的JComponents
。
3/ 延迟代码执行块并将其移动到EDT的末尾。