Swing入門以前 - Swingのスレッドポリシー(1)
Swingのことをweb検索しているとよくスレッドの話題を見かける。javax.swingパッケージのJavadocにもセクションが設けられているくらい重要な事項らしい。しかし、Swing入門書のサンプルコードを書き写している限りではスレッドの話なんて一言も出てこなかったが?
というわけで、スレッドについて調査することにした。「入門以前」としては、前回までの概念モデルと今回からのスレッドの調査で完了としよう、と考えている。
今回はThe Java Tutorialsのうち、Concurrency in Swingを主に参考にしている。
スレッドの種類
Swingで扱うスレッドは、以下の3種類に大別できる。2列目の記述は、現段階で理解している内容である。
イニシャルスレッド (initial theads) | mainメソッドが実行される、いわゆるメインスレッドをイメージすればよい。単純なSwingアプリケーションでは、何も行わない。 |
イベントディスパッチスレッド (EDT;event dispatch thread) | Swingコンポーネントのコントロールはすべてこのスレッドで実行する必要がある(ただし例外は有る)。 |
ワーカースレッド (worker threads) | 一般的に使用されているワーカースレッドと同じイメージ。バックグラウンドスレッドとも呼んでいるようだ。 |
ここで疑問点。
- メインスレッド(イニシャルスレッド)とイベントディスパッチスレッドは別物か?
イベントディスパッチスレッドというものがメインスレッドと同一のものであるならば、入門書では敢えてスレッドについて触れていないのもうなづける。…が、これは別物である。
ここが誤解していた点であり、理解を妨げていた箇所なのだが、Webでよく見かける「Swingはシングルスレッド設計」というような文章、これは「Swingコンポーネントのコントロールはイベントディスパッチスレッドという単一のスレッドで実行する必要がある」ということであり、Swingプログラムがシングルスレッドというわけではない(少なくともイニシャルスレッドとイベントディスパッチスレッドの2スレッドは使用される)。
イベントディスパッチスレッドを意識しなくてよい理由
Swingアプリケーションをプログラミングしてきたので、もちろんSwingコンポーネントのコントロールは行っている。しかし今までイベントディスパッチスレッド(EDT)は全く意識してこなかった。何故だろうか。
ここで、いつSwingコンポーネントを操作した(Swing系オブジェクトのメソッドを使用した)か考えてみた。以下の2点が心当たりとしてあった。
- (A):mainメソッドの中でJFrameのオブジェクトを作成(new)して表示(setVisible)した。
- (B):actionPerformedメソッドの中に、ボタンが押されたときに文字列を表示するようにした。
上記の(A), (B)は、Swingのスレッドポリシーというものに合致してるのか反しているのか?
« 4th MEDIA(@nifty TV)の解約 | トップページ | Javaでニコニコ動画風のプレイヤを作れるか »
この記事へのコメントは終了しました。
« 4th MEDIA(@nifty TV)の解約 | トップページ | Javaでニコニコ動画風のプレイヤを作れるか »
コメント