「そうめん」再履修(4) -擬似マルチスレッド 3.-
2008/12/08 20:20 - AS3.0
前回は run()および、run() から next()でつながる実行関数を持ったスレッドクラスが擬似マルチスレッドとして動く様子を見ました。
そのような構成をとっていたのは子スレッドである SubThread クラスだけで、親スレッドである MainThread は run() のみでしたが、今回は親スレッドにも run() 以外の実行関数がある場合の挙動を見てみます。
以下のようなスレッドクラスを用意します。
SubThreadA、B、C は前回と同じです。
MainThread は run() で上記三つを呼び出し(ここまでは前回やったこと)、run() から next() でつながった f2()メソッドで SubThreadD、E を呼び出します。SubThread は五つとも擬似マルチスレッドとして動くよう記述されています。
実行結果は以下のようになりました。
main f1 A f1 B f1 C f1 main f2 A f2 B f2 C f2 D f1 E f1 main finalize A f3 B f3 C finalize D f2 E f2 A f4 B f4 D f3 E f3 A finalize B f5 D finalize E f4 B f6 E f5 B finalize E finalize
SubThreadA、B、C が擬似マルチで一巡しただけで、MainThread が f2() に進んでしまっています。
そして二巡目からは全部の SubThread が擬似マルチとして動いています。 三順目には MainThread の finallize が実行されています。
前回も述べましたが、実行関数は、プログラムが処理する仕事量の最小単位として設計し、その内容としては継続して処理すべき仕事量をまとめておくのが良いと考えられます。
よって、今回のサンプルの場合、親スレッドの run() で呼び出される SubThreadA ~ C の全てが終了してから、親の f2() が呼び出され、そして SubThreadD、E が呼び出される、という流れが理想的。
そのように、擬似マルチスレッドの流れを制御したい場合はどうすんのか。
ここで出てくるのが join() メソッドですね。
今回の例では、親の run() で呼び出される SubThread のうち、一番処理が長いのは SubThreadB です。
よって、SubThreadB のインスタンスである tb の join() を呼び出せば、希望どおりの処理の流れとなるわけです。
上記コード11行目のように tb.join() を付け加えて実行した結果は以下のとおり。
main f1 A f1 B f1 C f1 A f2 B f2 C f2 A f3 B f3 C finalize A f4 B f4 A finalize B f5 B f6 B finalize main f2 D f1 E f1 main finalize D f2 E f2 D f3 E f3 D finalize E f4 E f5 E finalize
期待どおり SubThreadA ~ C が終了した後で親スレッドは f2() に進んでいます。
SubThreadD、E のインスタンスでは join() を呼んでいないので、親の f2() から呼び出される子スレッドが一巡した後で、即座に親の finallize() が実行されています。
tb ではなく ta や tc から join を呼び出した場合は、本稿最初の join() を一切記述しなかった場合と同様に、親の run() から呼び出される SubThread と親の f2() から呼び出される SubThread の混在並行処理になってしまうわけですね。
実は以前の「そうめん」検証シリーズでは join() の意義がいまいち実感できなかったんですが、マルチスレッドの挙動を確認して、やっとその重要性を認識した私です。
今まで私は、親スレッドのとある実行関数から複数の子スレッドを呼び出しても、呼び出された子スレッドは順次実行されて、それらの子スレッドが終わるまで親スレッドの当該実行関数は、次の実行関数を呼ばないという誤解をしていました。
それは、子スレッドの設計をこのシリーズの一番最初に提示した Java ならマルチスレッドになるけれども ActionScript ではマルチスレッドにならない記述法(run の中でループを設定するようなタイプ)しか思いが至らなかったからですね。
つまり「そうめん」が擬似マルチスレッド実行環境であることをきちんと認識していなかったがために起きた誤解なわけです。
でも擬似マルチスレッドの挙動が分かった今は違うぜ。
続く。