Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why SwingWorker? Why not just Thread or Runnable?

What are the advantages of using SwingWorker instead of Thread or Runnable?

like image 948
Rendicahya Avatar asked Dec 23 '10 11:12

Rendicahya


People also ask

Is SwingWorker a thread?

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.

How do you update Swing component from a thread other than EDT?

You can use invokeAndWait() and invokeLater() to update a Swing component from any arbitrary thread.


2 Answers

I think the documentation of the SwingWorker is pretty good:

An abstract class to perform lengthy GUI-interacting tasks in a dedicated thread.

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

  • Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive.
  • Swing components should be accessed on the Event Dispatch Thread only.

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.

surely you can do this using Thread, Runtime and SwingUtilities (invokeLater) but it's easier and probably less error prone using the SwingWorker class.

like image 174
user85421 Avatar answered Oct 06 '22 00:10

user85421


Thread and Runnable were part of Java 1.0; they're as good as they were back then.

The new concurrency classes distill all that's been learned about multi-threading since then (thank you, Doug Lea and others). Writing multi-threaded code is terribly difficult. The new concurrency classes, including SwingWorker, try to make that easier.

Start by noting the generics for strong typing. There's a mechanism built in to publish and process both final and intermediate results.

It'd be possible to mimic these with Thread and Runnable, but SwingWorker has done it for you.

like image 41
duffymo Avatar answered Oct 06 '22 00:10

duffymo