SwingUtilities.invokeLater做什么?

38 java swing multithreading awt event-dispatch-thread

怎么SwingUtilities.invokeLater办?它只是推迟在其run方法中执行一段代码吗?在invokeLater函数中调用一个动作或者在我们想要执行的线程的末尾调用它有什么区别?任何人都可以帮我完成这项invokeLater功能的真正功能吗?

Mau*_*lin 27

正如其他答案所说,它Runnable在AWT事件派发线程上执行.但是你为什么要那样做呢?由于Swing数据结构不是线程安全的,因此为程序员提供了一种易于实现的方法来阻止对它们的并发访问,Swing设计者规定了访问它们的所有代码必须在同一个线程上运行的规则.这会自动发生在事件处理和显示维护代码中,但是如果你已经启动了一个长时间运行的操作 - 当然是在一个新线程上 - 你怎么能指示它的进度或完成?您必须修改Swing控件,并且必须从事件派发线程执行此操作.因此invokeLater.

  • @Dmitry这是一个有趣的方式来看待它.Java不提供单线​​程的语言级支持(任何语言吗?).因此,需要它的框架必须提供支持它的功能,并为客户端程序员正确使用它制定规则.这不是"Java方法",而是Java中的一种方式. (3认同)

MBy*_*ByD 9

它将在AWT线程上运行该段代码.这允许您从其他线程修改GUI.

来自Docs:

导致doRun.run()在AWT事件派发线程上异步执行.这将在处理完所有挂起的AWT事件后发生.当应用程序线程需要更新GUI时,应使用此方法.