「そうめん」再履修(3) -擬似マルチスレッド 2.-
2008/12/07 19:45 - AS3.0
前回は「そうめん」で擬似マルチスレッドを実現させる場合、run()の中にループを設定するのではなく、ループの中に run()を書く、という話でした。
でもスレッドクラス内の関数は run() だけではありませんよね。 一番最初に呼び出されるのは run()ですが、その後、next()メソッドでつなぐことで、ユーザ定義関数を定義することができるのは皆さま先刻ご承知のとおり。
今回は run()以外の実行関数を持ったスレッドクラスが、擬似マルチスレッド実行されるときの様子を、もう予想はついていますが、あらためて確認してみます。
以下のようなスレッドクラスを用意します。
MainThread の run() の中で、三つの SubThread を実行するものです。 各 SubThread はそれぞれ run() 以外に f2() や f3() といったユーザ定義関数を持ち、それらは next()でつながっています。
実行結果は以下のようになります。
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
前回の擬似マルチスレッドの実行の様子からも推測されることですが、各 SubThread が実行関数の単位で順次に実行されているのが分かりますね。
Java のマルチスレッドでは、ひとつのスレッドがいちどきにどのくらいの仕事量がおこなわれるのかは、処理系に依存するのでユーザが把握することができないとのこと。
しかし「そうめん」は違います。ユーザがキッチリ設計することができます。 実行関数で分割すればいいんです。
ここで注意すべきは、run()を何度も繰り返すようなスレッドの場合、run()の中にループを設定するのではなく、ループによってrun()が何度も呼び出されるような記述をする必要がある、ということは前回示したとおりです。
前々回、「そうめん」において意識しなくてはならないこととして二点挙げました。
一点目は「そうめん」が持つふたつの側面。
- 擬似マルチスレッドシステムである
- 非同期処理をスマートに記述できる
そしてもう一点は、ふたつの処理単位。
- スレッド
- 実行関数
「そうめん」の疑似マルチスレッドは上記で見たように、実行関数単位でスレッドが切り替わるという挙動を取ります。
つまり処理の単位はスレッドではなく実行関数です。
前々回、スレッドよりも実行関数の方に、より注意を払うべきではないか、ということを書いた理由についてご理解いただけるのではないかと思います。
続く。