Swingスレッド

Swingはイベント駆動型であり、イベントが起きた際にイベントキューに入れられ、イベントディスパッチスレッド内でイベントキューに入っているイベントをFIFO形式に処理される。

例えば、JButtonにアクションリスナーをセットした際に、アクションイベントが起こった際の処理は、イベントディスパッチスレッドで行われる。Swingは一度描画されてからは、このイベントディスパッチスレッドからのみ操作されることを前提としている。前述したように、イベントはFIFO形式のキューなので、一つの処理に時間がかかっていると他の処理が遅延してしまう。描画に影響ない処理は極力別スレッドで実行すべきである。

●SwingWorker
上記は、SwingWorkerクラスの実装クラスを用いることで解決できる。
SwingWorker#excuteを実行すると、SwingWorker#doInBackgroundが別スレッドで処理される。またSwingWorker#doneが、doInBackgroundが終了した後に、イベントディスパッチスレッドで動作される。

●SwingUtilities#invokeLater
一方、イベントディスパッチスレッド外からイベントディスパッチスレッドに処理を行いたい場合は、SwingUtilities#invokeLaterを使用すると、invokeLaterの引数で指定したrunnableの実装クラスのrun関数がイベントディスパッチスレッドで実行される。
invokerLaterは、他で行われているSwingのイベントAWT イベントが処理されたあとに発生する。
またJComponentのrepaint,revalidate,invalidate関数は、イベントディスパッチスレッド外からイベントディスパッチスレッドでの処理を実行できる。

●まとめ
・イベントディスパッチスレッド ⇒ その他スレッド
SwingWorker
・その他スレッド ⇒ イベントディスパッチスレッド
SwingUtilities#invokeLater、JComponentのrepaint,revalidate,invalidate