EDU.oswego.cs.dl.util.concurrent.misc
public abstract class SwingWorker extends ThreadFactoryUser implements Runnable
This class was adapted from the SwingWorker written by Hans Muller and presented in "Using a Swing Worker Thread" in the Swing Connection - http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
A closely related version of this class is described in "The Last Word in Swing Threads" in the Swing Connection - http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html
This SwingWorker is a ThreadFactoryUser and implements Runnable. The default thread factory creates low-priority worker threads. A special constructor is provided for enabling a timeout. When the timeout expires, the worker thread is interrupted.
Note: Using a timeout of Long.MAX_VALUE
will not impose a
timeout but will create an additional thread of control that will respond
to an interrupt even if the construct
implementation ignores
them.
Sample Usage
import EDU.oswego.cs.dl.util.concurrent.TimeoutException; import EDU.oswego.cs.dl.util.concurrent.misc.SwingWorker; public class SwingWorkerDemo extends javax.swing.JApplet { private static final int TIMEOUT = 5000; // 5 seconds private javax.swing.JLabel status; private javax.swing.JButton start; private SwingWorker worker; public SwingWorkerDemo() { status = new javax.swing.JLabel("Ready"); status.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); getContentPane().add(status, java.awt.BorderLayout.CENTER); start = new javax.swing.JButton("Start"); getContentPane().add(start, java.awt.BorderLayout.SOUTH); start.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { if (start.getText().equals("Start")) { start.setText("Stop"); status.setText("Working..."); worker = new DemoSwingWorker(TIMEOUT); worker.start(); } else { worker.interrupt(); } } }); } private class DemoSwingWorker extends SwingWorker { private static final java.util.Random RAND = new java.util.Random(); public DemoSwingWorker(long msecs) { super(msecs); } protected Object construct() throws InterruptedException { // Take a random nap. If we oversleep, the worker times out. Thread.sleep(RAND.nextInt(2*TIMEOUT)); return "Success"; } protected void finished() { start.setText("Start"); try { Object result = get(); status.setText((String) result); } catch (java.lang.reflect.InvocationTargetException e) { Throwable ex = e.getTargetException(); if (ex instanceof TimeoutException) { status.setText("Timed out."); } else if (ex instanceof InterruptedException) { status.setText("Interrupted."); } else { status.setText("Exception: " + ex); } } catch (InterruptedException ex) { // event-dispatch thread won't be interrupted throw new IllegalStateException(ex+""); } } } }
Version: 3.0
Constructor Summary | |
---|---|
SwingWorker() Creates new SwingWorker with no timeout. | |
SwingWorker(long msecs)
Creates new SwingWorker with specified timeout. | |
protected | SwingWorker(ThreadFactory factory, long msecs)
Creates new SwingWorker with specified thread factory and timeout. |
Method Summary | |
---|---|
protected abstract Object | construct()
Computes the value to be returned by the get method. |
protected void | finished()
Called on the event dispatching thread (not on the worker thread)
after the construct method has returned. |
Object | get()
Return the value created by the construct method,
waiting if necessary until it is ready.
|
InvocationTargetException | getException()
Get the exception, or null if there isn't one (yet).
|
long | getTimeout()
Returns timeout period in milliseconds. |
void | interrupt()
Stops the worker and sets the exception to InterruptedException. |
boolean | isReady()
Return whether the get method is ready to
return a value.
|
void | run()
Calls the construct method to compute the result,
and then invokes the finished method on the event
dispatch thread. |
void | start()
Starts the worker thread. |
Object | timedGet(long msecs)
Wait at most msecs to access the constructed result. |
Parameters: msecs timeout in milliseconds, or 0
for no time limit.
Parameters: factory factory for worker threads. msecs timeout in milliseconds, or 0
for no time limit.
get
method.construct
method has returned.construct
method,
waiting if necessary until it is ready.
Returns: the value created by the construct
method
Throws: InterruptedException if current thread was interrupted InvocationTargetException if the constructing thread encountered an exception or was interrupted.
Returns: the exception encountered by the construct
method wrapped in an InvocationTargetException
0
(default).get
method is ready to
return a value.
Returns: true if a value or exception has been set. else false
construct
method to compute the result,
and then invokes the finished
method on the event
dispatch thread.Returns: current value
Throws: TimeoutException if not ready after msecs InterruptedException if current thread has been interrupted InvocationTargetException if the constructing thread encountered an exception or was interrupted.