【发布时间】:2015-05-08 19:28:11
【问题描述】:
我试着看看我是否可以回答this question earlier today。我意识到我并不完全理解 Event Dispatch Thread (EDT)。 Googling 确认并帮助解决了这一点,并澄清了 why I don't。 (This 也可能与理解有关。)
代码设置了一个 GUI,然后(如前面的问题)更新一个文本字段,直到取消设置一个标志。
我有几个问题/要求。
-
1234563在 EDT 上执行(是吗?)。这不是招致失败吗?
如果对
swingInit的调用在内部并且doIt在invokeLater外部,则代码也会运行。所以swingInit在 EDT 上执行,但doIt不在 EDT 上执行不应该是个问题吗? (我很惊讶这行得通。我应该是吗?)我想我明白为什么如果
doIt在invokeLater内,不管swingInit在哪里,它为什么会挂起:invokeLater的目的只是初始化 GUI(对吧?)。doIt是否应该只在 EDT 上启动(可能从发生的事件),但肯定不在invokeLater块内启动?
(EDT 概念的历史很有趣。并非总是如此。请参阅上面的“为什么我不理解它”的链接。)
import static java.awt.EventQueue.invokeLater;
import java.awt.event.*;
import javax.swing.*;
public class Whatever
{
static boolean flag = true;
static JTextField tf = new JTextField("Hi",20);
static JPanel p = new JPanel();
static JFrame f = new JFrame();
static JButton b = new JButton("End");
public static void main(String[] args)
{
swingInit();
invokeLater
(
new Runnable()
{
@Override
public void run()
{
// swingInit();
// doIt();
}
}
);
doIt();
}
static void swingInit()
{
b.addMouseListener
(
new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
flag = false;
JOptionPane.showMessageDialog(null,"Clicked... exiting");
System.exit(0);
}
}
);
p.add(tf);
p.add(b);
f.add(p);
f.setVisible(true);
f.pack();
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
static String getInfo(){
return "Hello... " + Math.random();
}
static void doIt(){
while(flag)
tf.setText(getInfo());
};
}
【问题讨论】:
-
我认为您理解,您不应该从 EDT 以外的线程更新 GUI - 但是,这样做不会必然失败 - 只是非常冒险。因此,如果此类代码有时似乎有效,请不要感到惊讶。
标签: java event-dispatch-thread invokelater