チェンジセット 531
- コミット日時:
- 2008/05/27 21:41:55 (6 ヶ月前)
- ファイル:
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/Thread/branches/soumen/src/org/libspark/utils/concurrent/Executor.as
r148 r531 1 package org.libspark.utils.concurrent1 package org.libspark.utils.concurrent 2 2 { 3 3 import org.libspark.thread.Thread; 4 4 5 /** 6 * Executor は複数のスレッドを実行するスレッドのための基底クラスです 7 */ 5 8 public class Executor extends Thread 6 9 { 10 /** 11 * 新しい Executor クラスのインスタンスを作成します 12 */ 7 13 public function Executor() 8 14 { … … 12 18 protected var _threads:Array; 13 19 20 /** 21 * 実行されるスレッドの数を返します 22 */ 14 23 public function get numThreads():uint 15 24 { … … 17 26 } 18 27 28 /** 29 * 指定されたインデックスのスレッドを取得します 30 * 31 * @param index 取得スレッドのインデックス 32 * @return インデックスの位置にあるスレッド 33 */ 19 34 public function getThreadAt(index:uint):Thread 20 35 { … … 22 37 } 23 38 39 /** 40 * 指定されたスレッドを追加します 41 * 42 * @param thread 追加するスレッド 43 * @return 追加されたスレッド 44 */ 24 45 public function addThread(thread:Thread):Thread 25 46 { … … 28 49 return thread; 29 50 } 30 31 public override function toString():String32 {33 return '[Executor]';34 }35 51 } 36 52 } as3/Thread/branches/soumen/src/org/libspark/utils/concurrent/ParallelExecutor.as
r137 r531 3 3 import org.libspark.thread.Thread; 4 4 5 /** 6 * ParallelExecutor は複数のスレッドを並列して実行するためのユーティリティクラスです 7 * 8 * 同時に全てのスレッドを開始し、全てのスレッドの実行が終了するとこのスレッドも終了します 9 */ 5 10 public class ParallelExecutor extends Executor 6 11 { 7 12 private var _index:uint; 8 13 9 protected override function initialize():void 14 /** 15 * @inheritDoc 16 */ 17 override public function interrupt():void 10 18 { 11 var threads:Array = _threads; 12 var l:uint = threads.length; 13 for (var i:uint = 0; i < l; ++i) { 14 Thread(threads[i]).begin(); 19 // 元の割り込み処理を呼び出す 20 super.interrupt(); 21 22 // 全てのスレッドに対しても割り込み処理をかける 23 for each (var thread:Thread in _threads) { 24 thread.interrupt(); 25 } 26 } 27 28 override protected function run():void 29 { 30 // 全てのスレッドを開始 31 for each (var thread:Thread in _threads) { 32 thread.start(); 15 33 } 16 34 35 // 次に終了を待つスレッドのインデックス 17 36 _index = 0; 37 38 waitThreads(); 18 39 } 19 40 20 pr otected override function execute():void41 private function waitThreads():void 21 42 { 22 43 // 全てのスレッドが終了するまで待つ、本当のマルチスレッドで言えば … … 27 48 // 28 49 // を行っている 29 30 for (; _index < _threads.length;) { 31 var thread:Thread = _threads[_index++]; 32 33 // まだ終了してなければ終了するまでjoinで待つ 34 if (!thread.isTerminated) { 35 thread.join(); 50 while (_index < _threads.length) { 51 // 終了待ちをするスレッドを取得 52 var thread:Thread = Thread(_threads[_index++]); 53 // スレッドの終了を待つ 54 if (thread.join()) { 55 // join の戻り値が true の場合、待機状態になったということなので 56 // 次にまたこのメソッドが実行されるよう設定してリターンする 57 next(waitThreads); 58 // ちなみに割り込みが発生しても無視する 59 interrupted(waitThreads); 36 60 return; 37 61 } 38 62 } 39 63 40 terminate(); 41 } 42 43 public override function toString():String 44 { 45 return '[ParallelExecutor]'; 64 // ここまで到達した場合全てのスレッドの実行が終了している 46 65 } 47 66 } as3/Thread/branches/soumen/src/org/libspark/utils/concurrent/SerialExecutor.as
r137 r531 3 3 import org.libspark.thread.Thread; 4 4 5 /** 6 * SerialExecutor は複数のスレッドを順番に実行するためのユーティリティクラスです 7 * 8 * 開始したスレッドの終了を待って次のスレッドを実行し、全てのスレッドの実行が終了するとこのスレッドも終了します 9 */ 5 10 public class SerialExecutor extends Executor 6 11 { … … 8 13 private var _current:Thread; 9 14 10 protected override function initialize():void 15 /** 16 * @inheritDoc 17 */ 18 override public function interrupt():void 11 19 { 12 _index = 0; 13 _current = null; 20 // 元の割り込み処理を呼び出す 21 super.interrupt(); 22 23 // 現在実行されているスレッドがあればそれにも割り込み処理をかける 24 if (_current != null) { 25 _current.interrupt(); 26 } 14 27 } 15 28 16 protected override function execute():void 29 /** 30 * 実行 31 */ 32 override protected function run():void 17 33 { 34 // 現在実行されているスレッドのインデックス 35 _index = 0; 36 // 現在実行されているスレッド 37 _current = null; 38 39 runThread(); 40 } 41 42 /** 43 * スレッド実行 44 */ 45 private function runThread():void 46 { 47 // 実行されていたスレッドがあれば 18 48 if (_current != null) { 49 // 実行されていたスレッドを破棄 19 50 _current = null; 51 // 次のインデックスへ 20 52 _index++; 21 53 } 22 54 55 // もう実行するスレッドがない場合終了する 23 56 if (_threads.length <= _index) { 24 terminate();25 57 return; 26 58 } 27 59 60 // 新たなスレッドを取得 28 61 var thread:Thread = _threads[_index]; 29 62 63 // 現在実行されているスレッドに設定 30 64 _current = thread; 31 65 32 thread.begin(); 66 // スレッドを開始 67 thread.start(); 68 // 終了を待つ 33 69 thread.join(); 34 } 35 36 public override function toString():String 37 { 38 return '[SerialExecutor]'; 70 71 // スレッドが終了した際に再びこのメソッドが実行されるよう設定 72 next(runThread); 39 73 } 40 74 }
