SwingWorker is an abstract class developed for Swing library of the Java programming language. It is used to performed lengthy GUI interaction tasks in a background thread. While developing applications, sometimes the GUI hangs when it is trying to do some huge or lengthy task. This lag is a big bottleneck. For such purposes, swingworker is developed which schedules the execution of this lengthy task on a different thread while the GUI still remains responsive.
Java language has three threads, namely:
- Current Thread (Initial Thread): this is the thread on which the initial application logic executes.
- Event Dispatch Thread: all event handling code executes on this thread.
- Worker Threads: also known as background thread where all time consuming background tasks are executed.
SwingWorker allows user to schedule the execution of background task on Worker Thread. But how will the user get to know when the task as finished its execution or if user needs to update GUI(running on initial thread) as per the thread execution? This implies we need inter-thread communication as well. SwingWorker is designed for such tricky situations which provides communication on event dispatch thread.
Important methods of SwingWorker:
- doInBackground(): This function contains our logic of the background task i.e. what we want our thread to do. This function runs on worker thread and is necessary to implement.
protected abstract T doInBackground() throws Exception Computes a result, or throws an exception if unable to do so. This method is executed in a background thread. Returns: the computed result Throws: Exception - if unable to compute a result
- done(): This function is called when the thread finished its execution. Also, any value returned by the doInBackground() function can be received inside this function using get(). Further, updates can be made to GUI inside this function. Thus, function executes on the Event Dispatch Thread after the doInBackground method is finished.
protected void done()
- execute(): Schedules this SwingWorker for execution on a worker thread.
public final void execute()
- publish() : 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.
protected final void publish(V... chunks)
- process(): Receives data chunks from the publish method asynchronously on the Event Dispatch Thread. Because this method is invoked asynchronously, publish() may have been called multiple times.
protected void process(List chunks) Parameters: chunks - intermediate results to process
- run(): Sets this Future to the result of computation unless it has been cancelled.
public final void run()
- setProgress: Sets the progress bound property. The value should be from 0 to 100.
protected final void setProgress(int progress) Example: setProgress(1); setProgress(2); setProgress(3); might result in a single PropertyChangeListener notification with the value 3. Parameters: progress - the progress value to set Throws: IllegalArgumentException - is value not from 0 to 100
- getProgress: Returns the progress bound property.
public final int getProgress() Returns: the progress bound property.
- cancel: Attempts to cancel execution of this task. This attempt will fail if the task has already completed, has already been cancelled, or could not be cancelled for some other reason. If successful, and 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 should be interrupted in an attempt to stop the task.
After this method returns, subsequent calls to Future.isDone() will always return true. Subsequent calls to Future.isCancelled() will always return true if this method returned true.
public final boolean cancel(boolean mayInterruptIfRunning) Parameters: mayInterruptIfRunning - true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete Returns: false if the task could not be cancelled, typically because it has already completed normally; true otherwise
- isCancelled: Returns true if this task was cancelled before it completed normally.
public final boolean isCancelled() Returns: true if this task was cancelled before it completed
- 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.
public final boolean isDone() Returns: true if this task completed
- get: Waits if necessary for the computation to complete, and then retrieves its result.
public final T get() throws InterruptedException, ExecutionException
- getState: Returns the SwingWorker state bound property.
public final SwingWorker.StateValue getState() Returns: the current state
An example to illustrate SwingWorker
We want or thread to start execution when button is clicked. See startThread() inside button’s action listener. The startThread function defines a new swingworker of the type javax.swing.SwingWorker where,
T – the result type returned by this SwingWorker’s doInBackground and get methods, which is String in below code.
V – the type used for carrying out intermediate results by this SwingWorker’s publish and process methods, which is Integer in below code.
- Run the above code, click the button, you’ll see a counter decrementing. Simultaneously do anything with the UI, it’ll still be responsive.
- List chunks is the parameter of process() function and contains the list of every result published by the thread till this time of datatype Integer. The datatype Integer should match with the our swingworker declaration.
Creating progress bar showing the progress of the task.
This article is contributed by Ekta Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to firstname.lastname@example.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
- Java.util.LinkedList.poll(), pollFirst(), pollLast() with examples in Java
- Java lang.Long.byteValue() method in Java with Examples
- Java lang.Long.reverse() method in Java with Examples
- Java.util.concurrent.RecursiveAction class in Java with Examples
- Java lang.Long.highestOneBit() method in Java with Examples
- Java.util.LinkedList.offer(), offerFirst(), offerLast() in Java
- Java.util.LinkedList.peek() , peekfirst(), peeklast() in Java
- Java.util.Collections.disjoint() Method in java with Examples
- Java lang.Long.lowestOneBit() method in Java with Examples
- Java lang.Long.numberOfLeadingZeros() method in Java with Examples
- Java lang.Long.numberOfTrailingZeros() method in Java with Examples
- Java.lang.Short toString() method in Java with Examples
- Java.util.function.DoublePredicate interface in Java with Examples
- Java.util.function.BiPredicate interface in Java with Examples
- Java.util.function.LongPredicate interface in Java with Examples