3

我在互联网上阅读了许多关于何时应该在 EDT 中运行以及何时不应该运行的文章。但是我仍然不确定我是否理解,所以我想问几个问题:

  1. 默认情况下,哪些代码将在 EDT内运行?

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

  3. 我什么时候应该使用 InvokeLater() 这样默认情况下会在 EDT 外部运行的东西会在其中运行?

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

谢谢

4

2 回答 2

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

首先非常感谢您很好地编辑格式化您的问题。回答你的问题时有很大帮助。

另外我必须承认我不是 100% 确定我的答案,所以伙计们:如果我错了,请随时纠正我。

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

  2. 不太确定。

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

  4. 所有会阻止您的 gui 与用户交互的东西,因为这需要大量时间,例如一些具有大量数据集的计算。但是您需要确保仅从一个线程访问值或将线程与volatile和同步
    synchronize。 .

于 2014-01-03T10:52:48.900 回答