やっと「そうめん」触ったよ(6) -スレッド間連携(引渡篇)-
2008/10/29 21:09 - AS3.0
「そうめん」のスレッドは、run() メソッドから始まり finalize() メソッドで終わるその行程がオートエグゼクになっているので、途中のメソッドに外部からのアクセスはできないっぽい。 てゆーか、そもそもそれ以前にスレッドクラス内メソッドは引数も返り値も取れないっぽい、ということを前回みました。
それでもやっぱりスレッドで生成したオブジェクトをなんとか外に引き継ぎたいので考えてみました。
公式で配布されているサンプルでは、探し方が足りなかったのか、そのような事例が見当たりません。 しかし、こうすれば実現可能という手段には思い至りました。 公式に推奨される手段かどうかは分かりませんのでそのつもりで。
前々回の受取篇同様、やはりコンボを使うと解決しそう。
今回は、メンバプロパティとゲッターのコンボです。
単純にスレッドクラスにゲッターを付与しただけでは生成したオブジェクトを外部に引き渡すことはできません。 じゃあどうすんだってのは、まず模式図から。
<MainThread> public class MainThread extends Thread { private var aTh:AThread; public function MainThread() { } override protected function run():void { aTh = new aThread(); aTh.start(); aTh.join(); next(nextStep); } private function nextStep():void { private var bTh:bThread = new bThread(aTh.returnValue); bTh.start(); bTh.join(); aTh = null; } }
<aThread> public class aThread extends Thread { private var _returnValue:Array; public function aThread() { } override protected function run():void { _returnValue = new Array(); _retuenValue に値を格納 } public function get returnValue():Array { return _returnValue; } }
これは MainThread 内で aThread と bThread という二つのスレッドを使用する例です。 aThread 内で生成したオブジェクトを bThread が使用しますが、aThread は非同期処理なので、aThread が完了してから bThread を呼び出したいという設定です。
そのため aThread と bThread の呼び出しは一つのメソッド内ではおこないません。 それぞれ run() メソッドと nextStep() として分断し、run から nextStep が next で呼び出されるという構成です。
ここでミソなのは aThread のインスタンスである aTh を MainThread のメンバにしているところ。 aTh を run のローカルにしてしまうと、nextStep で呼び出せませんからね。 で、aThread の方では、メンバとゲッターを定義します。
こうしておけば、nextStep の実行段階でも aTh が生きているので、aTh のゲッターを使って aTh 内で生成したオブジェクトが参照できるという仕組みです。
繰り返しますが、公式に想定された使用法かどうか分かりません。 保証があるかもわかりません。 しかし、このようなコードにすれば、スレッド内で生成されたオブジェクトを外に引き渡すことができるようになります。
前々回はスレッドにオブジェクトを渡す方法を、今回はスレッドからオブジェクトを取り出す方法を見てみました。
こうしてみると、スレッドクラスは個別に独立したクラスというよりもむしろ、親スレッドが持つメソッドと捉えた方がわかりやすいような気がします。