いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Swingスレッド処理-001

Swingは、シングルスレッド設計になっています。


これはつまり、Swingにて各コンポーネントの描画およびイベントのディスパッチ処理などは
一つのスレッドで行われるという事になります。


その処理を実際に行うスレッドをイベントディスパッチスレッドといいます.(Event Dispatch Thread: EDT)


Swingでアプリを作成する場合、この点をしっかり考慮しないと変なバグがでます。
(いきなりArrayIndexOutOfBoundExceptionやNullPointerが発生したり)


そして、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面白いですね。

以下、参考にしているリソースです。