Java Swing中的SwingWorker

來源:互聯網
上載者:User

標籤:

Swing中的SwingWorker主要是用來執行比較耗時的任務。

Java doc文檔中中包含了一些簡單的例子。

 

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):
? 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.

Workflow

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

? Current thread: The execute method is called on this thread. It schedules SwingWorker for the execution on a worker thread and returns immediately. One can wait for the SwingWorker to complete using the get methods.


? Worker thread: The doInBackground method is called on this thread. This is where all background activities should happen. To notify PropertyChangeListeners about bound properties changes use the firePropertyChange and getPropertyChangeSupport methods. By default there are two bound properties available: state and progress.


? Event Dispatch Thread: All Swing related activities occur on this thread. SwingWorker invokes the process and done methods and notifies any PropertyChangeListeners on this thread.


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> {@Overridepublic String doInBackground() {return findTheMeaningOfLife();}@Overrideprotected 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 extendsSwingWorker<List<Integer>, Integer> {PrimeNumbersTask(JTextArea textArea, int numbersToFind) {//initialize}@Overridepublic List<Integer> doInBackground() {while (! enough && ! isCancelled()) {number = nextPrimeNumber();publish(number);setProgress(100 * numbers.size() / numbersToFind);}}return numbers;}@Overrideprotected 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.
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 methodsSince:1.6Author:Igor Kushnirskiy

 

Java Swing中的SwingWorker

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.