问题
Possible Duplicate:
What does SwingUtilities.invokeLater do?
SwingUtilities.invokeLater
I have seen this little piece of code hundreds of times:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
Now my question is: what does invokeLater()
do? What kind of bad things will happen if I just create and show my GUI inside the main thread?
回答1:
Nothing bad will happen if you're updating it from the EDT while following guidelines.
That is...
If invokeLater is called from the event dispatching thread -- for example, from a JButton's ActionListener -- the doRun.run() will still be deferred until all pending events have been processed.
Source
If that isn't the case, invokeLater()
is required.
It schedules a Runnable
which will be executed on the EDT (event dispatching thread).
回答2:
1. Event Dispatcher Thread
is the GUI thread.
2. If you are talking about the main() method
...then its not long lived in Java Gui.
main()
method after scheduling the construction of GUI in EDT quits, now its EDT that handles the GUI.
3. invokeLater
means that this call will return immediately as the event is placed in Event Dispatcher Queue, and run()
method will run asynchronously...
回答3:
Swing is not thread-safe and all changes to Swing objects must be performed within the Event Dispatch Thread. If you try to run your code outside it, you'll get unspecified behavior, which will probably become weird at some point.
In contrast, the SWT/JFace GUI framework that Eclipse uses asserts the correct thread on each public entry point.
来源:https://stackoverflow.com/questions/12077245/what-is-swingutilities-invokelater