またはのSwingWorker
代わりに使用する利点は何ですか?Thread
Runnable
4 に答える
SwingWorkerのドキュメントはかなり良い と思います:
専用スレッドで長い GUI 対話タスクを実行するための抽象クラス。
Swing を使用してマルチスレッド アプリケーションを作成する場合、次の 2 つの制約に留意する必要があります ( 詳細については、スレッドの使用方法を参照してください)。
- 時間のかかるタスクは、イベント ディスパッチ スレッドで実行しないでください。そうしないと、アプリケーションが応答しなくなります。
- Swing コンポーネントには、イベント ディスパッチ スレッドでのみアクセスする必要があります。
これらの制約は、時間のかかるコンピューティングを行う GUI アプリケーションには、少なくとも 2 つのスレッドが必要であることを意味します。1) 時間のかかるタスクを実行するスレッドと、2) GUI 関連のすべてのアクティビティ用のイベント ディスパッチ スレッド (EDT) です。これには、実装が難しいスレッド間通信が含まれます。
SwingWorker は、長時間実行されるタスクをバックグラウンド スレッドで実行し、完了時または処理中に UI を更新する必要がある状況向けに設計されています。SwingWorker のサブクラスは、バックグラウンド計算を実行するために doInBackground() メソッドを実装する必要があります。
確かに、Thread、Runtime、および SwingUtilities ( invokeLater
) を使用してこれを行うことができますが、SwingWorker クラスを使用する方が簡単で、エラーが発生しにくい可能性があります。
SwingWorker は、タスクの実行中またはタスクの終了後に UI の更新など、いくつかの詳細を処理します。これらは、Swing EDT スレッドで実行する必要があります。あなたはそれを自分で行うことができますが、間違って行うのは簡単すぎます.
Thread と Runnable は Java 1.0 の一部でした。彼らは当時と同じくらい元気です。
新しい並行性クラスは、それ以降にマルチスレッドについて学んだことのすべてを抽出したものです (Doug Lea などに感謝します)。マルチスレッド コードを記述するのは非常に困難です。SwingWorker を含む新しい同時実行クラスは、それをより簡単にしようとします。
強い型付けのジェネリックに注目することから始めます。最終結果と中間結果の両方を公開して処理するためのメカニズムが組み込まれています。
これらを Thread と Runnable で模倣することは可能ですが、SwingWorker が代わりにそれを行います。
SwingWorker
イベントディスパッチスレッドとの正しい相互作用をカプセル化します。Runnable
そうではありません。