APIdia Launch Partner
Top Description Inners Fields Constructors Methods
javax.swing

public abstract Class SwingWorker<T, V>

extends Object
implements RunnableFuture<T>
Class Inheritance
All Implemented Interfaces
java.util.concurrent.RunnableFuture, java.util.concurrent.Future, java.lang.Runnable
Known Direct Subclasses
javax.swing.JEditorPane.PageLoader
Type Parameters
<T>
the result type returned by this SwingWorker's doInBackground and get methods
<V>
the type used for carrying out intermediate results by this SwingWorker's publish and process methods
Imports
java.awt.event.ActionEvent, .ActionListener, java.beans.PropertyChangeEvent, .PropertyChangeListener, .PropertyChangeSupport, java.lang.ref.WeakReference, java.util.List, java.util.concurrent.Callable, .CancellationException, .ExecutionException, .ExecutorService, .Executors, .FutureTask, .LinkedBlockingQueue, .RunnableFuture, .ThreadFactory, .ThreadPoolExecutor, .TimeUnit, .TimeoutException, sun.awt.util.ThreadGroupUtils, sun.swing.AccumulativeRunnable

An abstract class to perform lengthy GUI-interaction tasks in a background thread. Several background threads can be used to execute such tasks. However, the exact strategy of choosing a thread for any particular SwingWorker is unspecified and should not be relied on.

When writing a multi-threaded application using Swing, there are two constraints to keep in mind: (refer to Concurrency in Swing for more details):

These constraints mean that a GUI application with time intensive computing needs at least two threads: 1) a thread to perform the lengthy task and 2) the Event Dispatch Thread (EDT) for all GUI-related activities. This involves inter-thread communication which can be tricky to implement.

SwingWorker is designed for situations where you need to have a long running task run in a background thread and provide updates to the UI either when done, or while processing. Subclasses of SwingWorker must implement the doInBackground method to perform the background computation.

Workflow

There are three threads involved in the life cycle of a SwingWorker :

Often, the Current thread is the Event Dispatch Thread.

Before the doInBackground method is invoked on a worker thread, SwingWorker notifies any PropertyChangeListeners about the state property change to StateValue.STARTED. After the doInBackground method is finished the done method is executed. Then SwingWorker notifies any PropertyChangeListeners about the state property change to StateValue.DONE.

SwingWorker is only designed to be executed once. Executing a SwingWorker more than once will not result in invoking the doInBackground method twice.

Sample Usage

The following example illustrates the simplest use case. Some processing is done in the background and when done you update a Swing component.

Say we want to find the "Meaning of Life" and display the result in a JLabel.

  final JLabel label;
  class MeaningOfLifeFinder extends SwingWorker<String, Object> {
      @Override
      public String doInBackground() {
          return findTheMeaningOfLife();
      }

      @Override
      protected void done() {
          try {
              label.setText(get());
          } catch (Exception ignore) {
          }
      }
  }

  (new MeaningOfLifeFinder()).execute();

The next example is useful in situations where you wish to process data as it is ready on the Event Dispatch Thread.

Now we want to find the first N prime numbers and display the results in a JTextArea. While this is computing, we want to update our progress in a JProgressBar. Finally, we also want to print the prime numbers to System.out.

class PrimeNumbersTask extends
        SwingWorker<List<Integer>, Integer> {
    PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
        //initialize
    }

    @Override
    public List<Integer> doInBackground() {
        while (! enough && ! isCancelled()) {
                number = nextPrimeNumber();
                publish(number);
                setProgress(100 * numbers.size() / numbersToFind);
            }
        }
        return numbers;
    }

    @Override
    protected void process(List<Integer> chunks) {
        for (int number : chunks) {
            textArea.append(number + "\n");
        }
    }
}

JTextArea textArea = new JTextArea();
final JProgressBar progressBar = new JProgressBar(0, 100);
PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
task.addPropertyChangeListener(
    new PropertyChangeListener() {
        public  void propertyChange(PropertyChangeEvent evt) {
            if ("progress".equals(evt.getPropertyName())) {
                progressBar.setValue((Integer)evt.getNewValue());
            }
        }
    });

task.execute();
System.out.println(task.get()); //prints all prime numbers we have got

Because SwingWorker implements Runnable, a SwingWorker can be submitted to an java.util.concurrent.Executor for execution.

Author
Igor Kushnirskiy
Since
1.6

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
public static enum
SwingWorker.StateValue

Values for the state bound property.

private class

Field Summary

Modifier and TypeField and Description
private AccumulativeRunnable<Integer>
doNotifyProgressChange

handler for progress property change notifications.

private AccumulativeRunnable<V>
doProcess

Handler for process method.

private final AccumulativeRunnable<Runnable>
private static ExecutorService
private final FutureTask<T>
future

Everything is run inside this FutureTask.

private static final int
MAX_WORKER_THREADS

number of worker threads.

private volatile int
progress

current progress.

private final PropertyChangeSupport
propertyChangeSupport

all propertyChangeSupport goes through this.

private volatile SwingWorker.StateValue
state

current state.

Constructor Summary

AccessConstructor and Description
public
SwingWorker()

Constructs this SwingWorker.

Method Summary

Modifier and TypeMethod and Description
public final void
addPropertyChangeListener(PropertyChangeListener
the PropertyChangeListener to be added
listener
)

Adds a PropertyChangeListener to the listener list.

public final boolean
cancel(boolean mayInterruptIfRunning)

Implements java.util.concurrent.Future.cancel.

Attempts to cancel execution of this task.

protected abstract T

Returns:

the computed result
doInBackground
()

Computes a result, or throws an exception if unable to do so.

protected void
done()

Executed on the Event Dispatch Thread after the doInBackground method is finished.

private void
doneEDT()

Invokes done on the EDT.

public final void
execute()

Schedules this SwingWorker for execution on a worker thread.

public final void
firePropertyChange(String
the programmatic name of the property that was changed
propertyName
,
Object
the old value of the property
oldValue
,
Object
the new value of the property
newValue
)

Reports a bound property update to any registered listeners.

public final T
get()

Implements java.util.concurrent.Future.get.

Waits if necessary for the computation to complete, and then retrieves its result.

public final T
get(long timeout, TimeUnit unit)

Implements java.util.concurrent.Future.get.

Waits if necessary for at most the given time for the computation to complete, and then retrieves its result, if available.

public final int

Returns:

the progress bound property.
getProgress
()

Returns the progress bound property.

public final PropertyChangeSupport

Returns:

PropertyChangeSupport for this SwingWorker
getPropertyChangeSupport
()

Returns the PropertyChangeSupport for this SwingWorker.

public final SwingWorker.StateValue

Returns:

the current state
getState
()

Returns the SwingWorker state bound property.

private static synchronized ExecutorService

Returns:

ExecutorService for the SwingWorkers
getWorkersExecutorService
()

returns workersExecutorService.

public final boolean
isCancelled()

Implements java.util.concurrent.Future.isCancelled.

Returns true if this task was cancelled before it completed normally.

public final boolean
isDone()

Implements java.util.concurrent.Future.isDone.

Returns true if this task completed.

protected void
process(List<V>
intermediate results to process
chunks
)

Receives data chunks from the publish method asynchronously on the Event Dispatch Thread.

protected final void
publish(V...
intermediate results to process
chunks
)

Sends data chunks to the process method.

public final void
removePropertyChangeListener(PropertyChangeListener
the PropertyChangeListener to be removed
listener
)

Removes a PropertyChangeListener from the listener list.

public final void
run()

Implements java.util.concurrent.RunnableFuture.run.

Sets this Future to the result of computation unless it has been cancelled.

protected final void
setProgress(int
the progress value to set
progress
)

Sets the progress bound property.

private void
setState(SwingWorker.StateValue
the state to set
state
)

Sets this SwingWorker state bound property.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

doNotifyProgressChangeback to summary
private AccumulativeRunnable<Integer> doNotifyProgressChange

handler for progress property change notifications.

doProcessback to summary
private AccumulativeRunnable<V> doProcess

Handler for process method.

doSubmitback to summary
private final AccumulativeRunnable<Runnable> doSubmit
executorServiceback to summary
private static ExecutorService executorService
futureback to summary
private final FutureTask<T> future

Everything is run inside this FutureTask. Also it is used as a delegate for the Future API.

MAX_WORKER_THREADSback to summary
private static final int MAX_WORKER_THREADS

number of worker threads.

progressback to summary
private volatile int progress

current progress.

propertyChangeSupportback to summary
private final PropertyChangeSupport propertyChangeSupport

all propertyChangeSupport goes through this.

stateback to summary
private volatile SwingWorker.StateValue state

current state.

Constructor Detail

SwingWorkerback to summary
public SwingWorker()

Constructs this SwingWorker.

Method Detail

addPropertyChangeListenerback to summary
public final void addPropertyChangeListener(PropertyChangeListener listener)

Adds a PropertyChangeListener to the listener list. The listener is registered for all properties. The same listener object may be added more than once, and will be called as many times as it is added. If listener is null, no exception is thrown and no action is taken.

Note

This is merely a convenience wrapper. All work is delegated to PropertyChangeSupport from getPropertyChangeSupport.

Parameters
listener:PropertyChangeListener

the PropertyChangeListener to be added

cancelback to summary
public final boolean cancel(boolean mayInterruptIfRunning)

Implements java.util.concurrent.Future.cancel.

Doc from java.util.concurrent.Future.cancel.

Attempts to cancel execution of this task. This method has no effect if the task is already completed or cancelled, or could not be cancelled for some other reason. Otherwise, if this task has not started when cancel is called, this task should never run. If the task has already started, then the mayInterruptIfRunning parameter determines whether the thread executing this task (when known by the implementation) is interrupted in an attempt to stop the task.

The return value from this method does not necessarily indicate whether the task is now cancelled; use isCancelled.

doInBackgroundback to summary
protected abstract T doInBackground() throws Exception

Computes a result, or throws an exception if unable to do so.

Note that this method is executed only once.

Note

this method is executed in a background thread.

Returns:T

the computed result

Exceptions
Exception:
if unable to compute a result
doneback to summary
protected void done()

Executed on the Event Dispatch Thread after the doInBackground method is finished. The default implementation does nothing. Subclasses may override this method to perform completion actions on the Event Dispatch Thread. Note that you can query status inside the implementation of this method to determine the result of this task or whether this task has been cancelled.

See Also
doInBackground, isCancelled(), get
doneEDTback to summary
private void doneEDT()

Invokes done on the EDT.

executeback to summary
public final void execute()

Schedules this SwingWorker for execution on a worker thread. There are a number of worker threads available. In the event all worker threads are busy handling other SwingWorkers this SwingWorker is placed in a waiting queue.

Note

SwingWorker is only designed to be executed once. Executing a SwingWorker more than once will not result in invoking the doInBackground method twice.

firePropertyChangeback to summary
public final void firePropertyChange(String propertyName, Object oldValue, Object newValue)

Reports a bound property update to any registered listeners. No event is fired if old and new are equal and non-null.

This SwingWorker will be the source for any generated events.

When called off the Event Dispatch Thread PropertyChangeListeners are notified asynchronously on the Event Dispatch Thread.

Note

This is merely a convenience wrapper. All work is delegated to PropertyChangeSupport from getPropertyChangeSupport.

Parameters
propertyName:String

the programmatic name of the property that was changed

oldValue:Object

the old value of the property

newValue:Object

the new value of the property

getback to summary
public final T get() throws InterruptedException, ExecutionException

Implements java.util.concurrent.Future.get.

Doc from java.util.concurrent.Future.get.

Waits if necessary for the computation to complete, and then retrieves its result.

Note

calling get on the Event Dispatch Thread blocks all events, including repaints, from being processed until this SwingWorker is complete.

When you want the SwingWorker to block on the Event Dispatch Thread we recommend that you use a modal dialog.

For example:

class SwingWorkerCompletionWaiter implements PropertyChangeListener {
    private JDialog dialog;

    public SwingWorkerCompletionWaiter(JDialog dialog) {
        this.dialog = dialog;
    }

    public void propertyChange(PropertyChangeEvent event) {
        if ("state".equals(event.getPropertyName())
                && SwingWorker.StateValue.DONE == event.getNewValue()) {
            dialog.setVisible(false);
            dialog.dispose();
        }
    }
}
JDialog dialog = new JDialog(owner, true);
swingWorker.addPropertyChangeListener(
    new SwingWorkerCompletionWaiter(dialog));
swingWorker.execute();
//the dialog will be visible until the SwingWorker is done
dialog.setVisible(true);
Exceptions
InterruptedException:
if the current thread was interrupted while waiting
ExecutionException:
if the computation threw an exception
CancellationException:
if the computation was cancelled
getback to summary
public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException

Implements java.util.concurrent.Future.get.

Doc from java.util.concurrent.Future.get.

Waits if necessary for at most the given time for the computation to complete, and then retrieves its result, if available.

Please refer to get for more details.

Exceptions
InterruptedException:
if the current thread was interrupted while waiting
ExecutionException:
if the computation threw an exception
TimeoutException:
if the wait timed out
CancellationException:
if the computation was cancelled
getProgressback to summary
public final int getProgress()

Returns the progress bound property.

Returns:int

the progress bound property.

getPropertyChangeSupportback to summary
public final PropertyChangeSupport getPropertyChangeSupport()

Returns the PropertyChangeSupport for this SwingWorker. This method is used when flexible access to bound properties support is needed.

This SwingWorker will be the source for any generated events.

Note

The returned PropertyChangeSupport notifies any PropertyChangeListeners asynchronously on the Event Dispatch Thread in the event that firePropertyChange or fireIndexedPropertyChange are called off the Event Dispatch Thread.

Returns:PropertyChangeSupport

PropertyChangeSupport for this SwingWorker

getStateback to summary
public final SwingWorker.StateValue getState()

Returns the SwingWorker state bound property.

Returns:SwingWorker.StateValue

the current state

getWorkersExecutorServiceback to summary
private static synchronized ExecutorService getWorkersExecutorService()

returns workersExecutorService. returns the service and creates it if necessary.

Returns:ExecutorService

ExecutorService for the SwingWorkers

isCancelledback to summary
public final boolean isCancelled()

Implements java.util.concurrent.Future.isCancelled.

Doc from java.util.concurrent.Future.isCancelled.

Returns true if this task was cancelled before it completed normally.

isDoneback to summary
public final boolean isDone()

Implements java.util.concurrent.Future.isDone.

Doc from java.util.concurrent.Future.isDone.

Returns true if this task completed. Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method will return true.

processback to summary
protected void process(List<V> chunks)

Receives data chunks from the publish method asynchronously on the Event Dispatch Thread.

Please refer to the publish method for more details.

Parameters
chunks:List<V>

intermediate results to process

See Also
publish
publishback to summary
protected final void publish(V... chunks)

Sends data chunks to the process method. This method is to be used from inside the doInBackground method to deliver intermediate results for processing on the Event Dispatch Thread inside the process method.

Because the process method is invoked asynchronously on the Event Dispatch Thread multiple invocations to the publish method might occur before the process method is executed. For performance purposes all these invocations are coalesced into one invocation with concatenated arguments.

For example:

publish("1");
publish("2", "3");
publish("4", "5", "6");
might result in:
process("1", "2", "3", "4", "5", "6")

Sample Usage. This code snippet loads some tabular data and updates DefaultTableModel with it. Note that it safe to mutate the tableModel from inside the process method because it is invoked on the Event Dispatch Thread.

class TableSwingWorker extends
        SwingWorker<DefaultTableModel, Object[]> {
    private final DefaultTableModel tableModel;

    public TableSwingWorker(DefaultTableModel tableModel) {
        this.tableModel = tableModel;
    }

    @Override
    protected DefaultTableModel doInBackground() throws Exception {
        for (Object[] row = loadData();
                 ! isCancelled() && row != null;
                 row = loadData()) {
            publish((Object[]) row);
        }
        return tableModel;
    }

    @Override
    protected void process(List<Object[]> chunks) {
        for (Object[] row : chunks) {
            tableModel.addRow(row);
        }
    }
}
Parameters
chunks:V[]

intermediate results to process

Annotations
@SafeVarargs
@SuppressWarnings:varargs
See Also
process
removePropertyChangeListenerback to summary
public final void removePropertyChangeListener(PropertyChangeListener listener)

Removes a PropertyChangeListener from the listener list. This removes a PropertyChangeListener that was registered for all properties. If listener was added more than once to the same event source, it will be notified one less time after being removed. If listener is null, or was never added, no exception is thrown and no action is taken.

Note

This is merely a convenience wrapper. All work is delegated to PropertyChangeSupport from getPropertyChangeSupport.

Parameters
listener:PropertyChangeListener

the PropertyChangeListener to be removed

runback to summary
public final void run()

Implements java.util.concurrent.RunnableFuture.run.

Sets this Future to the result of computation unless it has been cancelled.

setProgressback to summary
protected final void setProgress(int progress)

Sets the progress bound property. The value should be from 0 to 100.

Because PropertyChangeListeners are notified asynchronously on the Event Dispatch Thread multiple invocations to the setProgress method might occur before any PropertyChangeListeners are invoked. For performance purposes all these invocations are coalesced into one invocation with the last invocation argument only.

For example, the following invocations:

setProgress(1);
setProgress(2);
setProgress(3);
might result in a single PropertyChangeListener notification with the value 3.
Parameters
progress:int

the progress value to set

Exceptions
IllegalArgumentException:
is value not from 0 to 100
setStateback to summary
private void setState(SwingWorker.StateValue state)

Sets this SwingWorker state bound property.

Parameters
state:SwingWorker.StateValue

the state to set

javax.swing back to summary

private Class SwingWorker.DoSubmitAccumulativeRunnable

extends AccumulativeRunnable<Runnable>
implements ActionListener
Class Inheritance
All Implemented Interfaces
java.awt.event.ActionListener, java.util.EventListener

Field Summary

Modifier and TypeField and Description
private static final int

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
public void
actionPerformed(ActionEvent event)

Implements java.awt.event.ActionListener.actionPerformed.

Invoked when an action occurs.

protected void
run(List<Runnable> args)

Implements abstract sun.swing.AccumulativeRunnable.run.

Equivalent to Runnable.run method with the accumulated arguments to process.

protected void
submit()

Overrides sun.swing.AccumulativeRunnable.submit.

Sends this Runnable for the execution

This method is to be executed only from add method.

Inherited from sun.swing.AccumulativeRunnable:
addrun

Field Detail

DELAYback to summary
private static final int DELAY

Constructor Detail

DoSubmitAccumulativeRunnableback to summary
private DoSubmitAccumulativeRunnable()

Method Detail

actionPerformedback to summary
public void actionPerformed(ActionEvent event)

Implements java.awt.event.ActionListener.actionPerformed.

Doc from java.awt.event.ActionListener.actionPerformed.

Invoked when an action occurs.

runback to summary
protected void run(List<Runnable> args)

Implements abstract sun.swing.AccumulativeRunnable.run.

Doc from sun.swing.AccumulativeRunnable.run.

Equivalent to Runnable.run method with the accumulated arguments to process.

Annotations
@Override
submitback to summary
protected void submit()

Overrides sun.swing.AccumulativeRunnable.submit.

Doc from sun.swing.AccumulativeRunnable.submit.

Sends this Runnable for the execution

This method is to be executed only from add method.

This implementation uses SwingWorker.invokeLater.

Annotations
@Override
javax.swing back to summary

public final Enum SwingWorker.StateValue

extends Enum<SwingWorker.StateValue>
Class Inheritance

Values for the state bound property.
Since
1.6

Field Summary

Modifier and TypeField and Description
public static final SwingWorker.StateValue
DONE

SwingWorker is DONE after doInBackground method is finished.

public static final SwingWorker.StateValue
PENDING

Initial SwingWorker state.

public static final SwingWorker.StateValue
STARTED

SwingWorker is STARTED before invoking doInBackground.

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
public static SwingWorker.StateValue
public static SwingWorker.StateValue[]
Inherited from java.lang.Enum:
clonecompareTodescribeConstableequalsfinalizegetDeclaringClasshashCodenameordinaltoStringvalueOf

Field Detail

DONEback to summary
public static final SwingWorker.StateValue DONE

SwingWorker is DONE after doInBackground method is finished.

PENDINGback to summary
public static final SwingWorker.StateValue PENDING

Initial SwingWorker state.

STARTEDback to summary
public static final SwingWorker.StateValue STARTED

SwingWorker is STARTED before invoking doInBackground.

Constructor Detail

StateValueback to summary
private StateValue()

Method Detail

valueOfback to summary
public static SwingWorker.StateValue valueOf(String name)
valuesback to summary
public static SwingWorker.StateValue[] values()
javax.swing back to summary

private Class SwingWorker.SwingWorkerPropertyChangeSupport

extends PropertyChangeSupport
Class Inheritance
Annotations
@SuppressWarnings:serial

Constructor Summary

AccessConstructor and Description
pack-priv

Method Summary

Modifier and TypeMethod and Description
public void
firePropertyChange(final PropertyChangeEvent evt)

Overrides java.beans.PropertyChangeSupport.firePropertyChange.

Fires a property change event to listeners that have been registered to track updates of all properties or a property with the specified name.

Inherited from java.beans.PropertyChangeSupport:
addPropertyChangeListeneraddPropertyChangeListenerfireIndexedPropertyChangefireIndexedPropertyChangefireIndexedPropertyChangefirePropertyChangefirePropertyChangefirePropertyChangegetPropertyChangeListenersgetPropertyChangeListenershasListenersremovePropertyChangeListenerremovePropertyChangeListener

Constructor Detail

SwingWorkerPropertyChangeSupportback to summary
pack-priv SwingWorkerPropertyChangeSupport(Object source)

Method Detail

firePropertyChangeback to summary
public void firePropertyChange(final PropertyChangeEvent evt)

Overrides java.beans.PropertyChangeSupport.firePropertyChange.

Doc from java.beans.PropertyChangeSupport.firePropertyChange.

Fires a property change event to listeners that have been registered to track updates of all properties or a property with the specified name.

No event is fired if the given event's old and new values are equal and non-null.

Annotations
@Override