「そうめん」再履修(2) -擬似マルチスレッド 1.-
2008/12/06 21:36 - AS3.0
前回、「そうめん」は以下のふたつの顔を持っていることに意識的であるべきだろうという話をしました。
- 擬似マルチスレッドシステムである
- 非同期処理をスマートに記述できる
そして後者の便利さばかりに目を惹かれがちですが、「そうめん」を真に理解するためにはむしろ前者の理解が重要なのではないだろうか、という話もしました。
今回から「そうめん」の擬似マルチスレッドの挙動についていろいろ見てみたいと思います。
まず以下のような三つのスレッドクラスを用意します。
SubThreadA と SubThreadB を並行処理させるため、MainThread の run()メソッドで呼び出す、というものだとします。
Java であるなら各 SubThread の run()がこのような記述でも、以下のような結果になるとのこと。
A 0 A 1 A 2 B 0 B 1 B 2 A 3 A 4 A 5 B 3 B 4 B 5 ……… ………
これは Java が言語レベルで並行処理をサポートしているからですが、ActionScript である「そうめん」では以下のような結果になります。
A 0 A 1 A 2 ……… ……… ……… A 97 A 98 A 99 B 0 B 1 B 2 ……… ……… ……… B 97 B 98 B 99
SubThreadA の for ループを終えてから SubThreadB の for ループが動き出すという流れ。 これは ActionScript が並行処理をサポートしていないから当然ですね。
「そうめん」は擬似的なマルチスレッドを実装しているとのことですが、では「そうめん」で上記 Java のような表示をさせたい、つまり擬似マルチスレッドを実行させたい場合はどうすんのか。
公式ドキュメントを読むと、SubThread の記述の仕方にコツがあることが分かります。 以下のような記述をするとのこと。
run()の中にループを作るのではなく、run()がループの中に入るイメージですね。 ループカウンターがメンバプロパティ化しています。
通常のコーディングをしている場合このようなループ記述をすることはあまりないと思いますが、「そうめん」の場合はこういうフォーマットなのだ、というふうに頭を切り替えなきゃいけませんね。
で上記「そうめん」書式で SubThreadA と SubThreadB を書き換えた上で実行した結果はこうなります。
A 0 B 0 A 1 B 1 A 2 B 2 A 3 B 3 A 4 B 4 A 5 B 5 ……… ……… ……… A 97 B 97 A 98 B 98 A 99 B 99
SubThreadA と SubThreadB の run()が交互に実行されているのが分かります。 擬似マルチスレッドになっているわけですね。
続く。