SwingWorker is a utility class developed by Sun Microsystems for the Swing library of the Java programming language. SwingWorker enables proper use of the event dispatching thread. As of Java 6, SwingWorker is included in the JRE.
Several incompatible, unofficial, versions of SwingWorker were produced from 1998 to 2006, and care must be taken to avoid the abundant documentation on these versions predating Java 6.
SwingWorker is useful when a time-consuming task has to be performed following a user-interaction event (for example, parsing a huge XML File, on pressing a JButton). The most straightforward way to do it is :loadXML
method will be called in the same thread as the main Swing thread (the Event dispatching thread), so if the method needs time to perform, the GUI will freeze during this time.
This problem is not specific to Java, but common to many GUI models. SwingWorker
proposes a way to solve it by performing the time-consuming task on another background thread, keeping the GUI responsive during this time.
The following code defines the SwingWorker, which encapsulates the loadXML
method call :
Execution is started by using the method.
The result can be retrieved by using the method.
As calling on the Event Dispatch Thread blocks all events, including repaints, from being processed until the task completes, one must avoid calling it before the lengthy operation has finished. There are two ways to retrieve the result after the task completion :
SwingWorker has been part of Java SE only since Java 6.0. Sun has released versions to be used with earlier JDKs, although they were unofficial versions which were not part of the Java SE and were not mentioned in the standard library documentation.[1] The most recent of these versions dates from 2003 and is often referred to as SwingWorker version 3.[2] Unfortunately, the JDK 6.0 SwingWorker and the Version 3 SwingWorker use different method names and are not compatible. The backport version (see below) is now recommended for pre-Java 6 usage.
An example for instantiating SwingWorker 3 is shown below:
The start
method executes the code added in the construct method in a separate thread.To be alerted when the background thread finishes, one need only override the finished
method. The construct
method can return a result which can later be retrieved using SwingWorker's get
method.
A backport of the Java 6 SwingWorker to Java 5 is available at http://swingworker.java.net/. Apart from the package name (org.jdesktop.swingworker
), it is compatible with the Java 6 SwingWorker.
System.ComponentModel.BackgroundWorker
- .NET Frameworkflash.system.Worker
- Adobe Flashandroid.os.AsyncTask
- Androidjavax.swing
package-summary before and after J2SE 6.0. Also notice that there is no SwingWorker class listed in the index pages of the documentation, until version 6.0: http://download.oracle.com/javase/1.5.0/docs/api/index-files/index-19.html, http://download.oracle.com/javase/6/docs/api/index-files/index-19.html.