札幌Javaコミュニティ第10回勉強会

OSC北海道の前日ということで、OSCでJavaFXの講演のために来札している櫻庭さんを迎え前夜祭的な特別セッションを行いました。第10回勉強会と区切りの勉強会です。とはいえ、平日の夜ということでなかなか参加するのも難しい時間、最終的な参加者は櫻庭さんを含めて5人でした。内容としてはSwingのスレッドモデルに関する話とSwingWorkerの使い方を簡単に紹介といった所です。

マルチスレッドなGUIのこと

自分が本格的にプログラミングを始めたのは大学を卒業する直前なのでまだ10年くらいです。既にWindowsも98からXPになるくらいの時期で、GUIも当たり前でした。それよりも前からGUIをどう効率よく処理するかというのは課題で、マルチスレッドなGUIも数多く研究されてきたという話を聞くことができました。結局はバグが多く旨い解決方法は見つからず、GUIはすべてシングルスレッドになってきたという経緯があるそうです。その後はグラフィックボードの進化やパソコン自体の性能が向上したことで、シングルスレッドでトラブルなく十分に実用的なパフォーマンスがでるようになったという事です。
これはマルチスレッドのアプリケーションを作るような際も重要なことで、不要な並列処理はいたずらに設計を複雑にします。当然、実装コストも増えますし、もっと大変なのはテストです。並列処理のテストは結構どうにもならないようなケースが多く、どれだけ固く設計をしておくかの方が重要です。

Swingもシングルスレッドモデルであること

続いてQueueの話とイベントを溜めるQueueとそれを処理するスレッドの話です。EDT(Event Dispatch Thread)とEventQueueの話は難しいと敬遠されることもあります。しかし、原理をしっかりと理解すれば実は単純なことです。それをどう説明するのかは興味がありました。
しかし、単純明快な方法だったので新鮮です。コード嫁、まさにそれに尽きるわけです。簡単に処理しているわけでコードも複雑なことはしていません。軽くみていくことで理解が深まる、このメソッドは今後使いたいところです。

長い処理をどうするか?

長い処理をボタンのアクションなどで実行したらどうなるか?ちょっとしたパズルです。ボタンのクリックイベントによるボタンの描画イベントは先に処理され、次にアクションが実行される、しかしsetText等のイベントはQueueに詰まれたまま処理されないから・・・と確認した上で自分は正解を導きました。
ここで面白かったのは参加者の中でまだJavaをはじめて数週間という方がいたのですが、正解していた事です。どうしてその選択指?と櫻庭さんも聞いていましたが、答えが「よくそんな状態になるので・・・」と答えていた事が興味深かったです。確かにそうなんですよね、そういうバグを入れるからボタンがへこんだまま反応しないんです。普段の観察力が高いのでしょう。とはいえ、そんな視点で回答して正解ってのは凄いと思います。

野良スレッド

Java5を使い出してからは、ほとんどThredをnewしなくなりました。当然、ExecutorsからThreadPoolを使う方が便利だからなわけですが、Java5以降ではThreadをnewしてはいけない、と考えてもいいそうです。そのようにnewしたThreadは野良スレッドと呼ばれます。野良スレッドは大抵は放置され、始末されないのです。野良スレッドは作ってはいけません。

SwingWorker

SwingWorkerを使えば、野良スレッドも使わずバックグラウンドの処理も行え、事後処理も可能になります。他にも途中経過をプログレスバーなどに表示するなどの使い方もできる、SwingWorkerはJava6では標準ライブラリ、Java5では拡張ライブラリとして使えます。

軽く飲み会

と、2時間ほどの勉強会を終えた後は近くのお店で色々とお話して解散となりました。このような機会を設けていただき櫻庭さんには感謝です。