Javaのお勉強 (2)
Sun MicrosystemsのサイトからJava Tutorial一式をダウンロードして、「Essential Java Classes」を勉強中。
ところでこのチュートリアル、今年の4月15日にアップデートされて、J2SE 5.0の機能が取り込まれたのらしいけれど、Firefoxで見るとデモAppletが見えなかったり、CPU負荷が100%まで上昇したりする。JRE 5.0をダウンロードして対応しよう、と思ったら、Mac版が提供されていない。やれやれ。
不具合といえば、このサイトのトップページをWindowsのInternetExplorerで見ると空白になってしまうことが判明。個別の記事のページは見えるので、Templateを変えたせいではないと思うのだけど... ヘルプデスクにメールを出してみた。
- Exceptionの扱い。他のメソッドが返すExceptionをtry, catch, finallyで扱うとコードがすっきりする。自分で処理せずに自分を呼んだメソッドにExceptionを渡すこともできる。メソッドの定義時に throws <exceptionクラス名> を宣言し、Exception発生時に throw <exceptionオブジェクト> で返す。RuntimeExceptionの場合は明示的に宣言しなくてもよい。catchではなるべくspecificなExceptionのみを捉え て、 recovery strategyがはっきりしている場合のみを処理するようにする。1.4からchained exceptionが扱えるようになった。ThrowableクラスにはExceptionの他にErrorがあるが、JVMのfatalなエラーなどに 用いられるので、ユーザープログラムでは処理する必要が無い(処理するべきでない)。
- Threadを使うと一つのプログラム中で複数の処理を同時並列的に実行できる。java.util.Timerなど。Swingを使う場合はjavax.swing.TimerやSwingWorkerなどが便利。Threadのクラスはrun()メ ソッドの中に一連の処理を記述する。TimerTaskを継承してクラスを作り、オブジェクトをTimer.schedule()でスケジューリングす る。親スレッドの終了はtimer.cancel()、ただしAWTを使った場合はSystem.exit(0)とする。timer = new Timer(true)でdaemonスレッドを作った時は、子スレッドが無くなるとプログラムは終了する。
生にスレッドを使うにはThreadクラスを 継承してrun()を上書き定義する方法と、Runnableインターフェースを実装する方法がある。Appletを作る場合はRunnableを 使う。
スレッドがstart()で実行可能状態になっている時、sleep(), wait(), IOブロッキングのいずれかによってスレッドの状態は実行不可に遷移する。wait()を解消するにはnotify(), notifyAll()を使う。
Threadクラスを終了するにはrun()を平常に終了させればよい。Threadのstop()は古くて危険なので今後は使わないこと。Appletの終了時にはユーザー定義クラスのstop()が呼ばれるので、変数などを利用してrun()に終了を伝える。
リリース5.0ではスレッドの状態の検知にThread.getStateが使えるようになった。それ以前のバージョンではisAlive()を使う。
大量の計算を必要とするrun()を持つスレッドでは、CPU資源を独占しないようにyield()を適宜呼ぶことが望ましい。
複 数のスレッドであるオブジェクトのデータを共有する場合、そのオブジェクトをロック・解放した上で、データの受け渡しを互いに知らせる仕組みが必要と なる。共有オブジェクトをロックするには、そのメソッド宣言時にsynchronizedを使う。あるオブジェクトがsynchronizedメソッドを 読んでいる時、同じ共有オブジェクトの他のsynchronizedメソッドを別のオブジェクトが呼び出すことはできない(ロックされる)。共有されるオ ブジェクトはあるデータが共有できるタイミングになるまでwait()で他のメソッドを呼んだスレッドのロックを解除する。データの準備が終わったメソッ ドはnotifyAll()を使って他のメソッドを呼んでいる全てのスレッドにwait()解除を知らせる。
データ構造の共有の場合、BlockingQueueの派生クラスを使えばコードが簡単になる。
Threadの替りにThreadPoolを使えば、RunnableやCallableを実装した複数のタスクのキュー制御がさらに簡単になる。
ところでこのチュートリアル、今年の4月15日にアップデートされて、J2SE 5.0の機能が取り込まれたのらしいけれど、Firefoxで見るとデモAppletが見えなかったり、CPU負荷が100%まで上昇したりする。JRE 5.0をダウンロードして対応しよう、と思ったら、Mac版が提供されていない。やれやれ。
不具合といえば、このサイトのトップページをWindowsのInternetExplorerで見ると空白になってしまうことが判明。個別の記事のページは見えるので、Templateを変えたせいではないと思うのだけど... ヘルプデスクにメールを出してみた。
