关于EDT(Java)

时间:2014-01-03 10:44:47

标签: java awt event-dispatch-thread invokelater

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

  1. 默认情况下会运行哪些代码内部 EDT?

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

  3. 我什么时候应该使用InvokeLater()这样的东西,默认情况下 在EDT之外跑,会在里面跑吗?

  4. 我应该何时阻止一段代码在EDT内运行(默认情况下),方法是创建一个新线程并将该代码放入其中?

  5. 由于

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

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

  2. 不太确定。

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

  4. 阻止你的gui用户互动的一切因为 这需要花费很多时间,例如一些计算很多 数据集..但您需要确保仅从中访问值 一个线程或用volatile
    来同步线程 synchronize ...