关于EDT(Java)

我已经在互联网上阅读了一些关于什么时候应该在EDT中运行的文章,以及什么时候不应该。 但是我仍然不确定我理解,所以我想问一些关于这个的问题:

  1. 在EDT 默认运行哪些代码?

  2. 在EDT 之外默认运行哪些代码?

  3. 我什么时候应该使用InvokeLater(),以便默认情况下在EDT之外运行,将在其中运行?

  4. 什么时候应该阻止一段代码在EDT中运行(默认情况下),通过创建一个新线程并将该代码放入其中?

谢谢

  1. 由事件侦听器执行的所有代码。
  2. main方法中的代码,在您明确启动的线程内执行的代码,或者使用Timer或SwingWorker启动的代码。
  3. 在main方法中创建Swing GUI时。 或者当您想要从后台线程内部与Swing组件(或其模型)进行交互时。
  4. 当这段代码阻塞(如长IO)或执行时间超过几毫秒时。 从EDT内部执行的所有代码都阻止该线程完成其主要工作:重新绘制GUI并对事件做出反应。

首先,非常感谢您对问题进行编辑格式化 。 在回答您的问题时,它会有很大帮助。

另外我不得不承认我对自己的答案并不是100%肯定,所以小伙子们:如果我错了,请随时纠正我。

  1. 一切都改变了您的图形用户界面。

  2. 对此不太确定。

  3. 如果你需要用时间密集的计算更新你的gui。 例如,如果要在JLabel中显示0到100000000之间的数字。

  4. 所有会阻止你的gui进行用户交互的东西,因为它需要很多时间,例如一些带有大量数据集的计算。但是你需要确保只从一个线程访问值或者用volatile来同步线程
    synchronize ……