「そうめん」再履修(6) -スレの流れを変えるモノ-
2008/12/11 21:23 - AS3.0
「そうめん」とは一言で言うとどういうライブラリなのかというと、以下のようになるのではないかと考えます。
シーケンシャルな流れと言いましたが、「そうめん」は擬似マルチスレッドを実現するライブラリでもあるため、今までと同じつもりで ActionScript プログラムを組んだときとは、感覚的に多少異なる挙動が見られる、ということを2回前に見ました。
各スレッドは、実行関数単位でスレッドが切り替わりますが、実行関数が複数個から成り立つスレッドを子として呼び出すというようなケースの場合、何の対処もしないシーケンシャルな流れでは、子スレッドが完了する前に親スレッドが進みます(「そうめん」再履修(4)の最初の実行結果参照)。
それでは困るので、擬似マルチスレッドの流れを制御するため join() というメソッドがあるという話もしました。
今回はそんなスレッドの流れを制御するメソッドを確認します。
スレッドの流れを制御するメソッドとしては join() を含めると以下のようなものがあります。 いずれも「待つ」という挙動を司ります(Monitor.wait() というメソッドもありますが、今回列挙する、待ち系メソッドとは若干意義が異なるような気がしたので、今回は除外)。
- sleep
- join
- event
event
指定したイベントが発生するまでスレッドの流れを一時停止するメソッド。 addEventListner と同じような感覚で使うメソッドです。
ところで addEventListner では第2引数にイベント発生時に実行したい関数を指定しますね。 この event() ではそれが第3引数になりますが、この『イベント発生時に実行したい関数』というのは、プログラム処理の流れとしては『次に実行したい関数』と捉えることが可能だと思います。
そのように考えると、『「そうめん」の実行関数では next() で次に実行したい関数を指定する』という部分と重なって見えてきますね。
なお、この event() で指定したイベントが発生し関数が実行されると、removeEventListener が実行され、関数とイベントが切り離されるようになっています。
つまり event() は一発屋ということですね。
sleep
指定した時間、スレッドの流れを一時停止するメソッド。
どういうタイミングでスレッドの流れが止まるのかは、公式ドキュメントに詳細がありますので、そちらをご参照ください。
join
上記二つはそれらのメソッドが呼び出されたスレッドそれ自体の流れを止めるものでした。 この join() はそれとは若干異なる制御を目的とする、と考えた方が良さそうです。
このメソッドは、子スレッドから親スレッドを一時停止するために使う、というのが一般的と思われます。
あるスレッドが子スレッドを呼び出した場合、その子スレッドが join() メソッドを呼び出すと、その子スレッドが終了するまで、親スレッドの流れが止まります。
ちなみに join() は引数に数値を指定すると sleep と同じような挙動もします。