【发布时间】:2014-04-14 07:42:00
【问题描述】:
我对@987654325@ 的签名感到困惑。它需要一个Runnable 对象。是交给 Event Dispatch Thread 的这个 Runnable 对象吗?为什么我不能在EDT的run方法上直接调用createAndShowGUI(如果可以的话)?
我有read articles 关于EDT 和invokeLater 的工作原理,但我对传递的Runnable 对象感到困惑。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
如果我在通话下方再次拨打 SwingUtilities.invokeLater 会发生什么?
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
SwingUtilities.invokeLater(new Runnable() {
public void run() {
doSomethingOnTopOfGUI();
}
});
【问题讨论】:
-
你有什么困惑?
-
什么是EDT的运行方法?你在哪里看到的?在java中,传递“代码块”的唯一方法是在类中。
Runnable.run方法中的“代码块”稍后会被调用。 -
这个问题没有意义。您似乎掌握了基本思想:EDT 在循环中运行并执行一小段代码,主要是为了对事件做出反应。通过使用 invokeLater 你传递了一个 Runnable 并且 EDT 调用它的 run 方法。您询问“直接”方式-您可以更直接吗?您如何想象“直接” api?
-
EDT 不是您自己开始的线程。它会自动启动,然后您使用 invokeLater() 传递一个任务(Runnable)以在该线程中运行。
-
阅读Producer/Consumer pattern。 EDT 就是这样的实现。任务从任何地方(其他线程和 EDT)发出到 EDT 的工作队列。 EDT 获取队列中的任务(一次一个)并运行它们。您无法将代码传递给
run方法,因为它已经运行的 EDT 并且只有一个。
标签: java multithreading swing awt event-dispatch-thread