- 型パラメータ:
- T- この- SwingWorker'sの- doInBackgroundメソッドおよび- getメソッドによって返される結果の型
- V- この- SwingWorker'sの- publishメソッドおよび- processメソッドを使って中間結果を計算するために使用する型
- すべての実装されたインタフェース:
- Runnable,- Future<T>,- RunnableFuture<T>
SwingWorkerのスレッドを選択する厳密な方法は指定されていないため、それに依存してはいけません。 
 Swingを使用してマルチスレッド・アプリケーションを記述する場合は、次の2つの制約に注意してください(詳細は「Concurrency in Swing」を参照)。
- イベント・ディスパッチ・スレッドでは時間のかかるタスクを実行しないようにしてください。 アプリケーションが応答しなくなります。
- Swingコンポーネントには、イベント・ディスパッチ・スレッド上でのみアクセスするようにしてください。
これらの制約があるため、時間のかかるGUIアプリケーションには、1)時間のかかるタスクを実行するスレッドと、2) GUI関連のすべての作業を実行するイベント・ディスパッチ・スレッド (EDT)の少なくとも2つのスレッドが必要になります。 このように複数のスレッドを使用する場合はスレッド間通信を行う必要がありますが、この機能は簡単に実装できない場合があります。
 SwingWorkerは、バックグラウンド・スレッドで実行時間の長いタスクを実行する必要があり、その実行中または実行完了後にUIを更新する必要がある場合を想定して設計されています。 SwingWorkerのサブクラスは、バックグラウンドで計算を行うため、doInBackground()メソッドを実装する必要があります。 
 
ワークフロー
 SwingWorkerのライフ・サイクル内には、次の3つのスレッドが存在します。
 
- 
 現在のスレッド: execute()メソッドはこのスレッド上で呼び出されます。 このメソッドは、ワーカー・スレッドでのSwingWorkerの実行スケジュールを立て、その情報をただちに返します。getメソッドを使ってSwingWorkerの完了を待機することもできます。
- 
 ワーカー・スレッド: doInBackground()メソッドはこのスレッド上で呼び出されます。 ここで、すべてのバックグラウンド作業が発生します。PropertyChangeListenersにバウンド・プロパティの変更を通知するには、firePropertyChangeメソッドとgetPropertyChangeSupport()メソッドを使用します。 デフォルトでは、stateとprogressの2つのバウンド・プロパティを使用できます。
- 
 イベント・ディスパッチ・スレッド: Swing関連のすべての作業は、このスレッド上で発生します。 SwingWorkerはprocessメソッドとdone()メソッドを呼び出し、このスレッド上のすべてのPropertyChangeListenersに通知します。
現在のスレッドがイベント・ディスパッチ・スレッドである場合もあります。
 ワーカー・スレッド上でdoInBackgroundメソッドが呼び出される前に、SwingWorkerはすべてのPropertyChangeListenersに、stateプロパティの値がStateValue.STARTEDに変更されたことを通知します。 doInBackgroundメソッドの実行が完了すると、doneメソッドが実行されます。 続いて、SwingWorkerはすべてのPropertyChangeListenersに、stateプロパティの値がStateValue.DONEに変更されたことを通知します。 
 
 SwingWorkerは1回だけ実行されるように設計されています。 SwingWorkerを複数回実行しても、doInBackgroundメソッドは1回しか呼び出されません。 
 
使用例
次に、もっとも単純な使用例を示します。 一部の処理はバックグラウンドで実行されます。実行が完了したら、Swingコンポーネントを更新します。
 ここでは、「Meaning of Life」を検索し、結果を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();
 
 次の例は、準備の完了したデータをイベント・ディスパッチ・スレッド上で処理する場合に使用できます。
 ここでは、最初のN個の素数を検索し、結果をJTextAreaに表示します。 これは計算処理なので、JProgressBarで進捗状況を更新する必要があります。 また、検索された素数を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
 
 
 SwingWorkerはRunnableを実装するので、SwingWorkerをExecutorに送信して実行できます。
- 導入されたバージョン:
- 1.6
- 
ネストされたクラスのサマリーネストされたクラスインタフェースjava.util.concurrent.Futureで宣言されたネストされたクラス/インタフェースFuture.State
- 
コンストラクタのサマリーコンストラクタ
- 
メソッドのサマリー修飾子と型メソッド説明final voidリスナー・リストにPropertyChangeListenerを追加します。final booleancancel(boolean mayInterruptIfRunning) このタスクの実行の取消しを試みます。protected abstract T結果を計算するか、計算できない場合は例外をスローします。protected voiddone()doInBackgroundメソッドの実行完了後、イベント・ディスパッチ・スレッドで実行されます。final voidexecute()ワーカー・スレッドでのSwingWorkerの実行スケジュールを作成します。final voidfirePropertyChange(String propertyName, Object oldValue, Object newValue) すべての登録済みリスナーにバウンド・プロパティが更新されたことを報告します。final Tget()必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。final T必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。final intprogressバウンド・プロパティを返します。final PropertyChangeSupportこのSwingWorkerのPropertyChangeSupportを返します。final SwingWorker.StateValuegetState()SwingWorker状態バウンド・プロパティを返します。final booleanこのタスクが正常に完了する前に取り消された場合はtrueを返します。final booleanisDone()このタスクが完了した場合はtrueを返します。protected voidイベント・ディスパッチ・スレッドで、publishメソッドから非同期でデータ・チャンクを受信します。protected final voidprocess(java.util.List<V>)メソッドにデータ・チャンクを送信します。final voidPropertyChangeListenerをリスナー・リストから削除します。final voidrun()取り消されていなければ、このFutureに計算結果を設定します。protected final voidsetProgress(int progress) progressバウンド・プロパティを設定します。クラス java.lang.Objectで宣言されたメソッドclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitインタフェース java.util.concurrent.Futureで宣言されたメソッドexceptionNow, resultNow, state
- 
コンストラクタの詳細- 
SwingWorkerpublic SwingWorker()このSwingWorkerを構築します。
 
- 
- 
メソッドの詳細- 
doInBackground結果を計算するか、計算できない場合は例外をスローします。このメソッドは1回だけ実行されます。 ノート: このメソッドは、バックグラウンド・スレッドで実行されます。 - 戻り値:
- 計算結果
- 例外:
- Exception- 結果を計算できなかった場合
 
- 
runpublic final void run()取り消されていなければ、このFutureに計算結果を設定します。- 定義:
- run、インタフェース- Runnable
- 定義:
- run、インタフェース- RunnableFuture<T>
 
- 
publish@SafeVarargs protected final void publish(V... chunks) process(java.util.List<V>)メソッドにデータ・チャンクを送信します。 このメソッドはdoInBackgroundメソッド内部で使用され、イベント・ディスパッチ・スレッド上での処理のためprocessメソッド内部で中間結果を配信します。processメソッドはイベント・ディスパッチ・スレッド上で非同期で呼び出されるので、processメソッドが実行される前に、publishメソッドが複数回呼び出されることがあります。 パフォーマンスの向上のため、これらのすべての呼出しは1回の呼出しにまとめられます。各呼出しの引数は連結されます。たとえば: publish("1"); publish("2", "3"); publish("4", "5", "6");結果は次のようになります。process("1", "2", "3", "4", "5", "6")使用例 このコード(抜粋)は、テーブル・データをロードし、このテーブル・データを使って DefaultTableModelを更新します。 これはイベント・ディスパッチ・スレッド上で呼び出されるので、processメソッド内部でtableModelが変更される危険性はありません。class TableSwingWorker extends SwingWorker<DefaultTableModel, Object[]> { private final DefaultTableModel tableModel; public TableSwingWorker(DefaultTableModel tableModel) { this.tableModel = tableModel; }@Overrideprotected DefaultTableModel doInBackground() throws Exception { for (Object[] row = loadData(); ! isCancelled() && row != null; row = loadData()) { publish((Object[]) row); } return tableModel; }@Overrideprotected void process(List<Object[]> chunks) { for (Object[] row : chunks) { tableModel.addRow(row); } } }- パラメータ:
- chunks- 処理対象となる中間結果
- 関連項目:
 
- 
processイベント・ディスパッチ・スレッドで、publishメソッドから非同期でデータ・チャンクを受信します。詳細については、 publish(V...)メソッドを参照してください。- パラメータ:
- chunks- 処理対象となる中間結果
- 関連項目:
 
- 
doneprotected void done()doInBackgroundメソッドの実行完了後、イベント・ディスパッチ・スレッドで実行されます。 デフォルト実装は何も実行しません。 サブクラスは、このメソッドをオーバーライドして、イベント・ディスパッチ・スレッド上で完了処理を実行することがあります。 このメソッドの実装内部でステータスを照会して、このタスクの結果や、このタスクが取り消されていないかどうかを確認できます。- 関連項目:
 
- 
setProgressprotected final void setProgress(int progress) progressバウンド・プロパティを設定します。 0から100の値を指定してください。PropertyChangeListenerメソッドはイベント・ディスパッチ・スレッド上で非同期で通知を受け取るので、PropertyChangeListenersが呼び出される前に、setProgressメソッドが複数回呼び出されることがあります。 パフォーマンスの向上のため、これらのすべての呼出しは1回の呼出しにまとめられます。この場合、最後の呼出しの引数のみが有効になります。たとえば、次の呼出しです: setProgress(1); setProgress(2); setProgress(3); これは、値3を持つ1回のPropertyChangeListener通知にまとめられます。- パラメータ:
- progress- 設定する進捗値
- 例外:
- IllegalArgumentException- 0から100以外の値を指定した場合
 
- 
getProgresspublic final int getProgress()progressバウンド・プロパティを返します。- 戻り値:
- progressバウンド・プロパティ。
 
- 
executepublic final void execute()ワーカー・スレッドでのSwingWorkerの実行スケジュールを作成します。 多数のワーカー・スレッドを使用できます。 すべてのワーカー・スレッドがほかのSwingWorkersの処理でビジー状態になっている場合、このSwingWorkerは待機キューに入ります。ノート: SwingWorkerは1回だけ実行されるように設計されています。SwingWorkerを複数回実行しても、doInBackgroundメソッドは1回しか呼び出されません。
- 
cancelpublic final boolean cancel(boolean mayInterruptIfRunning) このタスクの実行の取消しを試みます。 このメソッドは、タスクが既に完了または取消されている場合や、他の理由で取消されない場合には効果がありません。 それ以外の場合、cancelがコールされたときにこのタスクが開始されていない場合、このタスクは実行されません。 タスクがすでに開始されている場合、mayInterruptIfRunningパラメータにより、このタスク(実装によって既知の場合)を実行しているスレッドがタスクを停止しようとして中断されるかどうかが決まります。このメソッドからの戻り値は、必ずしもタスクが取り消されたかどうかを示すわけではありません。 Future.isCancelled()を使用します。
- 
isCancelledpublic final boolean isCancelled()このタスクが正常に完了する前に取り消された場合はtrueを返します。- 定義:
- isCancelled、インタフェース- Future<T>
- 戻り値:
- このタスクが完了する前に取り消された場合はtrue
 
- 
isDonepublic final boolean isDone()このタスクが完了した場合はtrueを返します。 完了の理由は、正常終了、例外、取り消しなどがありますが、いずれの場合もこのメソッドはtrueを返します。
- 
getpublic final T get() throws InterruptedException, ExecutionException必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。ノート: イベント・ディスパッチ・スレッド上で getを呼び出すと、このSwingWorkerの実行が完了するまで、すべてのイベント(再ペイントなど)の処理がブロックされます。イベント・ディスパッチ・スレッド上で SwingWorkerをブロックするには、モーダル・ダイアログを使用することをお勧めします。たとえば: 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);- 定義:
- get、インタフェース- Future<T>
- 戻り値:
- 計算結果
- 例外:
- CancellationException- 計算が取り消された場合
- InterruptedException- 待機中に現在のスレッドで割込みが発生した場合
- ExecutionException- 計算で例外がスローされた場合
 
- 
getpublic final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。詳細については、 get()を参照してください。- 定義:
- get、インタフェース- Future<T>
- パラメータ:
- timeout- 待機する最長時間
- unit- timeout引数の時間単位
- 戻り値:
- 計算結果
- 例外:
- CancellationException- 計算が取り消された場合
- InterruptedException- 待機中に現在のスレッドで割込みが発生した場合
- ExecutionException- 計算で例外がスローされた場合
- TimeoutException- 待機がタイム・アウトになった場合
 
- 
addPropertyChangeListenerpublic final void addPropertyChangeListener(PropertyChangeListener listener) リスナー・リストにPropertyChangeListenerを追加します。 リスナーは、すべてのプロパティに対して登録されます。 同じリスナー・オブジェクトを複数回追加でき、追加した回数だけリスナー・オブジェクトが呼び出されます。listenerがnullの場合、例外はスローされず、何も処理は行われません。ノート: これは簡易ラッパーです。 すべての処理は、 getPropertyChangeSupport()からPropertyChangeSupportに委譲されます。- パラメータ:
- listener- 追加される- PropertyChangeListener
 
- 
removePropertyChangeListenerpublic final void removePropertyChangeListener(PropertyChangeListener listener) PropertyChangeListenerをリスナー・リストから削除します。 すべてのプロパティに登録されたPropertyChangeListenerを削除します。 同じイベント・ソースにlistenerが2回以上追加された場合は、削除された後に1回少ない通知が行われます。listenerがnullの場合、または追加されなかった場合、例外はスローされず、何も処理は行われません。ノート: これは簡易ラッパーです。 すべての処理は、 getPropertyChangeSupport()からPropertyChangeSupportに委譲されます。- パラメータ:
- listener- 削除する- PropertyChangeListener
 
- 
firePropertyChangeすべての登録済みリスナーにバウンド・プロパティが更新されたことを報告します。old値とnew値が等しく、nullでない場合、イベントはトリガーされません。この SwingWorkerは、生成されるすべてのイベントのソースになります。イベント・ディスパッチ・スレッドを取り消した場合、 PropertyChangeListenersはイベント・ディスパッチ上で非同期で通知を受信します。ノート: これは簡易ラッパーです。 すべての処理は、 getPropertyChangeSupport()からPropertyChangeSupportに委譲されます。- パラメータ:
- propertyName- 変更されたプロパティのプログラム名
- oldValue- プロパティの古い値
- newValue- プロパティの新しい値
 
- 
getPropertyChangeSupportpublic final PropertyChangeSupport getPropertyChangeSupport()このSwingWorkerのPropertyChangeSupportを返します。 このメソッドは、バウンド・プロパティに頻繁にアクセスする必要がある場合に使用します。この SwingWorkerは、生成されるすべてのイベントのソースになります。ノート: firePropertyChangeまたはfireIndexedPropertyChangeがイベント・ディスパッチ・スレッドを取り消した場合、返されるPropertyChangeSupportは、イベント・ディスパッチ・スレッド上のすべてのPropertyChangeListenerに非同期で通知を送信します。- 戻り値:
- このSwingWorkerのPropertyChangeSupport
 
- 
getStatepublic final SwingWorker.StateValue getState()SwingWorker状態バウンド・プロパティを返します。- 戻り値:
- 現在の状態
 
 
-