Swingは、シングルスレッド設計になっています。
これはつまり、Swingにて各コンポーネントの描画およびイベントのディスパッチ処理などは
一つのスレッドで行われるという事になります。
その処理を実際に行うスレッドをイベントディスパッチスレッドといいます.(Event Dispatch Thread: EDT)
Swingでアプリを作成する場合、この点をしっかり考慮しないと変なバグがでます。
(いきなりArrayIndexOutOfBoundExceptionやNullPointerが発生したり)
そして、Swingには上記の点に関連して以下のルールが存在します。
- Sun Developer Network(SDN)のThreads and Swingより抜粋
Once a Swing component has been realized, all code that might affect or depend on the state of that component should be executed in the event-dispatching thread.
"Swingのコンポーネントが実体化された後、そのコンポーネントの状態に影響するもしくは依存する全てのコードはイベントディスパッチスレッドで実行しなければならない"
コンポーネントの状態に影響するもしくは依存するというのは、
jLabel.getText();
や
textField.setText("hoge")
や
defaultTableModel.addRow(new Object[]{"hoge", "hehe"});
などが該当します。てか、コンポーネントに対する処理のほぼ全てです。
スレッドセーフに処理を行えるメソッド(つまりどのスレッドからでも呼び出せるメソッド)
については、javadocに以下の記述があります。
このメソッドはスレッドセーフですが、ほとんどの Swing メソッドは違います。詳細は、「Threads and Swing」を参照してください。
でも、実際簡単なプログラム(サンプルみたいなもの)ではこの点を考慮しなくてもうまく動きます。
問題となるのはマルチスレッドでプログラムを組みだした時です。
私自身最近Swingやりだしたので、ここにまとめを書いていこうと思います。
Swing面白いですね。
以下、参考にしているリソースです。
- Swing Tutorial How to Use Threads
- SDN Threads and Swing
- SDN Using a Swing Worker Thread
- SDN The Last Word in Swing Threads
- swingwiki Swing multi-threading issues
- WisdomSoft Swing とスレッド
- @IT Swingのキホン
- JavaWorld Online マルチスレッド・プログラミングの基本
- SDN Multithreaded Swing Applications
- SDN Concurrency In Swing Text
- Sun Java Tutorial Lesson: Concurrency
- TECHSCORE マルチスレッドプログラミング
- Swing基本Tips
- Java Swing Tips - てんぷらメモ(役に立つサンプルがたくさんあります)
- IBM DevelopersWork(マルチスレッド化Javaアプリケーションの作成)
- Desktop Java Live(java.net)