main
method of the program class. In applets
the initial threads are the ones that construct the applet object and
invoke its init
and start
methods; these
actions may occur on a single thread, or on two or three different
threads, depending on the Java platform implementation. In this
lesson, we call these threads the initial threads.
In Swing programs, the initial threads don't have a lot to do. Their
most essential job is to create a Runnable
object that
initializes the GUI and schedule that object for execution on the
event dispatch thread. Once the GUI is created, the program is
primarily driven by GUI events, each of which causes the execution of
a short task on the event dispatch thread. Application code can
schedule additionals tasks on the event dispatch thread (if they
complete quickly, so as not to interfere with event processing) or a
worker thread (for long-running tasks).
An initial thread schedules the GUI creation task by invoking
javax.swing.SwingUtilities.invokeLater
or
javax.swing.SwingUtilities.invokeAndWait
. Both of these methods take a single argument: the
Runnable
that defines the new task. Their only difference
is indicated by their names: invokeLater
simply schedules
the task and returns; invokeAndWait
waits for the task to
finish before returning.
You can see examples of this throughout the Swing tutorial:
SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } });
init
method using invokeAndWait
; otherwise,
init
may return before the GUI is created, which may
cause problems for a web browser launching an applet. In any other
kind of program, scheduling the GUI-creation task is usually the last
thing the initial thread does, so it doesn't matter whether it
uses invokeLater
or invokeAndWait
.
Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread. This restriction is discussed further in the next section.