チェンジセット 641

差分発生行の前後
無視リスト:
コミット日時:
2008/06/14 12:14:58 (5 ヶ月前)
コミッタ:
yossy
ログメッセージ:

Thread: branches/soumen を trunk にマージ

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/Thread/trunk

    • 属性の設定値: svn:ignore (登録)
      obj
      bin
  • as3/Thread/trunk/samples/urlloader/MainThread.as

    r150 r641  
    1 package 
     1package 
    22{ 
     3        import flash.events.Event; 
    34        import org.libspark.thread.Thread; 
    4          
    5         import org.libspark.utils.concurrent.Executor; 
    6         import org.libspark.utils.concurrent.SerialExecutor; 
    7          
    8         import org.libspark.net.URLLoaderThread; 
     5        import org.libspark.thread.utils.Executor; 
     6        import org.libspark.thread.utils.ParallelExecutor; 
     7        import org.libspark.thread.threads.net.URLLoaderThread; 
    98         
    109        import flash.net.URLRequest; 
     
    1413         
    1514        /** 
    16          * このスレッドは、URLLoaderThreadとSerialExecutorを用いて、平行して三つのURLからデータをダウンロードします 
     15         * このスレッドは、URLLoaderThread と ParallelExecutor を用いて、平行して三つの URL からデータをダウンロードします 
    1716         */ 
    1817        public class MainThread extends Thread 
     
    2120                 
    2221                /** 
    23                  * initializeメソッドには初期化処理を記述します 
     22                 * スレッドの処理は run メソッドをオーバーライドして記述します 
    2423                 */ 
    25                 protected override function initialize():void 
     24                override protected function run():void 
    2625                { 
    27                         // 並列してスレッドを実行するためのSerialExecutorを作成します 
    28                         _loaders = new SerialExecutor(); 
     26                        // 並列してスレッドを実行するための ParallelExecutor を作成します 
     27                        _loaders = new ParallelExecutor(); 
    2928                         
    3029                        // これに、三つのURLLoaderThreadを追加します 
     
    3231                        _loaders.addThread(new URLLoaderThread(new URLRequest('http://www.yahoo.co.jp/'))); 
    3332                        _loaders.addThread(new URLLoaderThread(new URLRequest('http://www.adobe.com/jp/'))); 
     33                         
     34                        trace('begin loading.'); 
     35                         
     36                        // ロード処理を開始 (= SerialExecutor スレッドを開始) します 
     37                        _loaders.start(); 
     38                        // スレッドが終了 (= ロードが完了) するまで、次のメソッドが実行されないように待ちます 
     39                        _loaders.join(); 
     40                         
     41                        // 次に実行されるメソッドをセットしておきます 
     42                        next(executeComplete); 
     43                        // 例外ハンドラを設定しておきます 
     44                        error(IOError, errorHandler); 
     45                        error(SecurityError, errorHandler); 
    3446                } 
    3547                 
    3648                /** 
    37                  * exeucteメソッドにはスレッドの処理を記述します 
    38                  */ 
    39                 protected override function execute():void 
    40                 { 
    41                         // 次に実行されるメソッドをセットしておきます 
    42                         switchExecuteMethod(executeComplete); 
    43                          
    44                         trace('begin loading.'); 
    45                          
    46                         // ロード処理を開始(=SerialExecutorスレッドを開始)します 
    47                         _loaders.begin(); 
    48                         // スレッドが終了(=ロードが完了)するまで、次のメソッドが実行されないように待ちます 
    49                         _loaders.join(); 
    50                 } 
    51                  
    52                 /** 
    53                  * executeCompleteメソッドには、ロード完了後の処理を書く事にします 
     49                 * executeComplete メソッドには、ロード完了後の処理を書く事にします 
    5450                 */ 
    5551                private function executeComplete():void 
     
    6460                        } 
    6561                         
    66                         // 終了 
    67                         terminate(); 
     62                        // next を設定しなければスレッドは終了します 
     63                        // 終了の前には finalize が呼び出されます 
    6864                } 
    6965                 
    7066                /** 
    71                  * finalizeメソッドには終了処理を書きます 
     67                 * スレッドの終了処理は finalize メソッドをオーバーライドして記述します 
    7268                 */ 
    7369                protected override function finalize():void 
     
    7975                 
    8076                /** 
    81                  * catchErrorメソッドには、例外処理を書きます 
    82                  * 子スレッド(=_loaders)で発生した例外もここにきます 
     77                 * 例外ハンドラ 
    8378                 * 
    84                  * @param thread 例外が発生したスレッド 
    85                  * @param e 発生した例外 
     79                 * @param      e       発生した例外 
     80                 * @param      thread  発生元のスレッド 
    8681                 */ 
    87                 protected override function catchError(thread:Thread, e:Error):void 
     82                private function errorHandler(e:IOError, t:Thread):void 
    8883                { 
    89                         try { 
    90                                 throw e; 
    91                         } 
    92                         catch (ioError:IOError) { 
    93                                 // IOErrorなので例外を出力して終了 
    94                                 trace(ioError.message); 
    95                                 terminate(); 
    96                                 return; 
    97                         } 
    98                         catch (securityError:SecurityError) { 
    99                                 // SecurityErrorなので例外を出力して終了 
    100                                 trace(securityError.message); 
    101                                 terminate(); 
    102                                 return; 
    103                         } 
     84                        trace('error!!'); 
    10485                         
    105                         // それ以外の例外はこのスレッドの管轄外なので上位スレッドに投げる 
    106                         throw e; 
    107                 } 
    108                  
    109                 public override function toString():String 
    110                 { 
    111                         return '[Main]'; 
     86                        // 例外を出力して終了 
     87                        trace(e.getStackTrace()); 
     88                        // 例外ハンドラから終了するには、明示的に next(null) を呼び出します 
     89                        next(null); 
    11290                } 
    11391        } 
  • as3/Thread/trunk/samples/urlloader/Sample.as

    r150 r641  
    1 package 
     1package 
    22{ 
    3        import flash.display.Sprite; 
    4         import flash.events.Event; 
    5          
    6        import org.libspark.thread.MasterThread
    7          
     3    import flash.display.Sprite; 
     4 
     5    import org.libspark.thread.Thread; 
     6    import org.libspark.thread.EnterFrameThreadExecutor
     7 
    88        /** 
    9          * このサンプルではURLLoaderThreadの使用方法などを学びます 
     9         * このサンプルでは URLLoaderThread の使用方法などを学びます 
    1010         * 
    11          * 詳細はMainThreadを見てください 
     11         * 詳細は MainThread を見てください 
    1212         */ 
    1313        public class Sample extends Sprite 
     
    1515                public function Sample() 
    1616                { 
    17                         // スレッドを実行するためのMasterThreadを作成します 
    18                         // 引数には一番最初に実行するスレッド(メインスレッド)を渡します。ここではMainThread 
    19                         _master = new MasterThread(new MainThread()); 
    20                          
    21                         addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
    22                 } 
    23                  
    24                 private var _master:MasterThread; 
    25                  
    26                 private function enterFrameHandler(event:Event):void 
    27                 { 
    28                         // MasterThreadのexecuteActiveThreadsメソッドを呼び出すことで、スレッドが実行されます 
    29                         // 通常、EnterFrameのタイミングで呼び出すことになるでしょう 
    30                         _master.executeActiveThreads(); 
     17            // スレッドを実行するには、まずはじめに Thread#initialize をコールし、スレッドライブラリを初期化します 
     18            // Thread#initialize には、IThreadExecutor のインスタンスを渡します 
     19                        // ここでは EnterFrameExecutor を渡し、毎フレームスレッドが実行されるようにします 
     20            Thread.initialize(new EnterFrameThreadExecutor()); 
     21 
     22            // MainThread を起動します 
     23                        var main:MainThread = new MainThread(); 
     24                        main.start(); 
    3125                } 
    3226        } 
  • as3/Thread/trunk/src/org/libspark/thread/Thread.as

    r175 r641  
     1/* 
     2 * ActionScript Thread Library 
     3 *  
     4 * Licensed under the MIT License 
     5 *  
     6 * Copyright (c) 2008 BeInteractive! (www.be-interactive.org) and 
     7 *                    Spark project  (www.libspark.org) 
     8 *  
     9 * Permission is hereby granted, free of charge, to any person obtaining a copy 
     10 * of this software and associated documentation files (the "Software"), to deal 
     11 * in the Software without restriction, including without limitation the rights 
     12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
     13 * copies of the Software, and to permit persons to whom the Software is 
     14 * furnished to do so, subject to the following conditions: 
     15 *  
     16 * The above copyright notice and this permission notice shall be included in 
     17 * all copies or substantial portions of the Software. 
     18 *  
     19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
     20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
     21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
     22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
     23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
     24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
     25 * THE SOFTWARE. 
     26 *  
     27 */ 
    128package org.libspark.thread 
    229{ 
    3         import org.libspark.thread.errors.ThreadErrorHandler; 
    4  
    5         public class Thread extends MonitorObject 
     30        import flash.events.Event; 
     31        import flash.events.IEventDispatcher; 
     32        import flash.utils.Dictionary; 
     33        import flash.utils.getQualifiedClassName; 
     34        import flash.utils.getQualifiedSuperclassName; 
     35        import flash.utils.getDefinitionByName; 
     36        import org.libspark.thread.errors.CurrentThreadNotFoundError; 
     37        import org.libspark.thread.errors.IllegalThreadStateError; 
     38        import org.libspark.thread.errors.InterruptedError; 
     39        import org.libspark.thread.errors.ThreadLibraryNotInitializedError; 
     40         
     41        /** 
     42         * Thread クラスは ActionScript Thread Library 1.0 (そうめん) の核となるクラスで、擬似スレッドを実現します. 
     43         *  
     44         * <p>ここで実現される擬似スレッドは、タスクシステムと Java のスレッドモデルをベースとしています。 
     45         * 処理をいくつかのメソッドに切り分け、呼び出すメソッド (「<em>実行関数</em>」と呼びます) を切り替えつつ 
     46         * 順々に実行していくことで、処理を進めます。</p> 
     47         *  
     48         * <p>新しいスレッドを作成するためには、まず Thread クラスのサブクラスを作成します。 
     49         * このサブクラスは、 Thread クラスの run メソッドをオーバーライドする必要があります。 
     50         * たとえば、「Hello, Thread!!」と出力するスレッドは、次のようになります。</p> 
     51         * <listing>public class HelloThread extends Thread 
     52         * { 
     53         *     override protected function run():void 
     54         *     { 
     55         *         trace('Hello, Thread!!'); 
     56         *     } 
     57         * }</listing> 
     58         *  
     59         * <p>作成したスレッドを実行するためには、 Thread Library を初期化する必要があります。 
     60         * 次のように、 Thread クラスの静的メソッド initialize を呼び出すことで初期化を行います。 
     61         * このとき、引数に IThreadExecutor インターフェイスの実装クラスのインスタンスを指定します。 
     62         * この IThreadExecutor インスタンスは、「いつスレッドを実行するか」を決める重要な役割を担っています。 
     63         * ここでは、 EnterFrameThreadExecutor クラスのインスタンスを渡し、フレーム実行のタイミングで 
     64         * スレッドが実行されるようにしています。初期化処理は、アプリケーションの最初で一度だけ行えば、その後呼び出す必要はありません。</p> 
     65         * <listing>Thread.initialize(new EnterFrameThreadExecutor());</listing> 
     66         *  
     67         * <p>最後に、次のように HelloThread クラスのインスタンスを作り、 start メソッドを呼び出すことで、 
     68         * スレッドの実行を開始します。</p> 
     69         * <listing>var t:Thread = new HelloThread(); 
     70         * t.start();</listing> 
     71         *  
     72         * <p>スレッドは親子関係を形成します。この親子関係は、スレッドの実行開始時に決定されます。 
     73         * スレッドの start を呼び出したスレッド (つまりカレントスレッド) は、親スレッドとなり、 
     74         * start が呼び出されたスレッドは、その親スレッドの子スレッドとなります。 
     75         * ただし、 start の呼び出しがスレッドの外 (つまりカレントスレッドが null のとき) に行われた場合、 
     76         * start が呼び出されたスレッドはトップレベルスレッドとなります。</p> 
     77         *  
     78         * <p>スレッドの親子関係は、スレッドの実行順序と例外の伝播において重要になります。 
     79         * スレッドの実行は、一番最初に開始されたトップレベルスレッドから始まります。今、このスレッドを A と呼ぶことにします。 
     80         * A に子スレッドがいる場合、 A の実行よりも先にまず、子スレッドが、開始された順番で実行されます。 
     81         * この子スレッドが実行されるとき、その子スレッドにさらに子スレッド (Aから見て孫スレッド) がいる場合、 
     82         * その子スレッドの実行より先に孫スレッドが開始された順番で実行され、これが子スレッドがいなくなるまで続けられます。 
     83         * 全ての A の子スレッドの実行が終了すると、 A が実行され、次に、A の次に開始されたトップレベルスレッドの実行が 
     84         * 同様にして続きます。</p> 
     85         *  
     86         * <p>スレッド内で例外が発生し、その例外が、例外が発生したスレッド内で捕捉されなかった場合、 
     87         * 例外は親スレッドに伝播します。例外が発生したのがトップレベルスレッドで、親スレッドがいない場合、 
     88         * 例外は uncaughtErrorHandler に渡されます。</p> 
     89         *  
     90         * <p>子スレッドよりも先に親スレッドが終了した場合、その親スレッドの全ての子スレッドは孤児スレッドとなり、 
     91         * トップレベルスレッドとして再配置されます。</p> 
     92         *  
     93         * <p>スレッドはある時点で、以下のいずれかの状態を取ります。これらの値は ThreadState クラスで定義されており、 
     94         * state プロパティを通して知ることができます。</p> 
     95         * <ul> 
     96         * <li>NEW</li> 
     97         * <li>RUNNABLE</li> 
     98         * <li>WAITING</li> 
     99         * <li>TIMED_WAITING</li> 
     100         * <li>TERMINATING</li> 
     101         * <li>TERMINATED</li> 
     102         * </ul> 
     103         *  
     104         * <p>スレッドが生成されると、まずはじめに状態は「NEW」に設定されます。この後、 start メソッドによって 
     105         * スレッドが開始されると、状態は「RUNNABLE」に設定されます。「NEW」以外の状態のスレッドを start メソッドによって 
     106         * 開始することはできません。</p> 
     107         *  
     108         * <p>wait メソッド、 join メソッド等の呼び出しによってスレッドが待機状態になる場合、状態は「WAITING」に 
     109         * 設定されます。このとき、タイムアウトが設定されるか、sleep メソッドの呼び出しである場合、状態は「TIMED_WAITING」に 
     110         * 設定されます。待機状態が解除されると状態は元に戻ります。</p> 
     111         *  
     112         * <p>スレッドが終了フェーズに移行すると、状態は「TERMINATING」に設定されます。スレッドが終了フェーズから 
     113         * 実行フェーズに戻ることは無く、同様に状態が「TERMINATING」から「RUNNABLE」に戻ることもありません。 
     114         * 終了フェーズが終わり、完全にスレッドが終了すると、状態は「TERMINATED」に設定されます。</p> 
     115         *  
     116         * <p>スレッドの動作を視覚的に知りたい場合、以下の動作チャートを見ることをお勧めします。</p> 
     117         * <ul> 
     118         * <li>http://www.libspark.org/htdocs/as3/thread-files/behavior-chart.png</li> 
     119         * </ul> 
     120         *  
     121         * @author      yossy:beinteractive 
     122         * @see #run() 
     123         * @see #initialize() 
     124         * @see #start() 
     125         * @see #uncaughtErrorHandler() 
     126         * @see #state 
     127         * @see ThreadState 
     128         * @see http://www.libspark.org/htdocs/as3/thread-files/behavior-chart.png 
     129         */ 
     130        public class Thread extends Monitor 
    6131        { 
    7                 private static const STATE_STANDINGBY:uint = 0; 
    8                 private static const STATE_RUNNING:uint = 1 << 0; 
    9                 private static const STATE_SLEEPING:uint = 1 << 1; 
    10                 private static const STATE_SUSPENDING:uint = 1 << 2; 
    11                 private static const STATE_TERMINATED:uint = 1 << 3; 
    12                 private static const STATE_ERROR:uint = 1 << 4; 
    13                  
     132                private static var _executor:IThreadExecutor; 
     133                private static var _threadIndex:uint = 0; 
    14134                private static var _currentThread:Thread = null; 
    15                 internal static var _debug:Debug = null; 
    16                  
     135                private static var _toplevelThreads:Array = []; 
     136                private static var _uncaughtErrorHandler:Function = null; 
     137                 
     138                /** 
     139                 * スレッドライブラリを初期化します. 
     140                 *  
     141                 * <p>このメソッドは、最初に一度だけ呼び出してください。</p> 
     142                 *  
     143                 * <p>スレッドの実行は、指定された IThreadExecutor インスタンスによって行われます。 
     144                 * (このメソッド内で、 IThreadExectuor#start が呼び出されます)</p> 
     145                 *  
     146                 * @param       executor        スレッドの実行を行う IThreadExecutor 
     147                 * @see IThreadExecutor 
     148                 */ 
     149                public static function initialize(executor:IThreadExecutor):void 
     150                { 
     151                        _threadIndex = 0; 
     152                        _currentThread = null; 
     153                        _toplevelThreads.length = 0; 
     154                         
     155                        // 古い IThreadExecutor の実行を止める 
     156                        if (_executor != null) { 
     157                                _executor.stop(); 
     158                        } 
     159                         
     160                        _executor = executor; 
     161                         
     162                        // 新しい IThreadExecutor の実行を開始 
     163                        if (_executor != null) { 
     164                                _executor.start(); 
     165                        } 
     166                } 
     167                 
     168                /** 
     169                 * initialize メソッドの呼び出しによって IThreadExecutor が設定され、スレッドが実行可能な状態であれば true、そうでなければ false を返します. 
     170                 *  
     171                 * @see #initialize() 
     172                 */ 
     173                public static function get isReady():Boolean 
     174                { 
     175                        return _executor != null; 
     176                } 
     177                 
     178                /** 
     179                 * 現在実行中のスレッドを返します. 
     180                 *  
     181                 * <p>現在実行中のスレッドがない場合、 null を返します。</p> 
     182                 */ 
    17183                public static function get currentThread():Thread 
    18184                { 
     
    20186                } 
    21187                 
     188                /** 
     189                 * 現在実行中のスレッドを返します. 
     190                 *  
     191                 * <p>ただし、現在実行中のスレッドがない(currentThread が null)の場合は CurrentThreadNotFoundError をスローします。</p> 
     192                 *  
     193                 * @return      現在実行中のスレッド 
     194                 * @throws      org.libspark.thread.errors.CurrentThreadNotFoundError   現在実行中のスレッドがない場合 
     195                 * @private 
     196                 */ 
     197                internal static