チェンジセット 729
- コミット日時:
- 2008/06/28 23:16:04 (2 ヶ月前)
- ファイル:
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
trac/htdocs/as3/thread-files/document/index.html
r708 r729 25 25 -- * スレッドの良さが伝わる何か 26 26 -- 27 -- 説明が足りない, 誤字脱字, 意見要望 等ありましたらフォーラムやチケットで。27 -- 説明が足りない, 誤字脱字, 意見要望, その他ツッコミ等ありましたらフォーラムやチケットで。 28 28 -- * http://forum.libspark.org/ 29 29 -- * http://www.libspark.org/newticket … … 33 33 <body> 34 34 <div id="header"> 35 <h1 >ActionScript Thread Library 1.0 (そうめん) ドキュメント</h1>35 <h1 id="thread-documentation">ActionScript Thread Library 1.0 (そうめん) ドキュメント</h1> 36 36 <hr /> 37 37 </div> … … 48 48 <hr /> 49 49 50 <h2 >1. スレッドライブラリの導入</h2>51 52 <h3 >1-1. スレッドとは</h3>50 <h2 id="introduction">1. スレッドライブラリの導入</h2> 51 52 <h3 id="what-is-thread">1-1. スレッドとは</h3> 53 53 54 54 <p>はじめにこの処理をして、次にこの処理をして...、という処理の流れを「<strong>スレッド</strong> (Thread)」と呼びます。英単語の「Thread」には「糸」「縫い糸」「筋道」「脈絡」といった意味があります。</p> … … 60 60 できるだけイベントのことを考えずに同期的に処理を書ける機構を提供します。</p> 61 61 62 <h3 >1-2. インストール</h3>63 64 <h4 >1-2-1. Flash CS3 の場合 (mxp パッケージ)</h4>62 <h3 id="installation">1-2. インストール</h3> 63 64 <h4 id="installation-flashcs3">1-2-1. Flash CS3 の場合 (mxp パッケージ)</h4> 65 65 66 66 <ol> 67 67 <li><a href="http://www.adobe.com/jp/exchange/em_download/">Adobe Extensiton Manager</a> のインストールが済んでいない場合、インストールします。</li> 68 <li>ActionScript Thread Library プロジェクトページの「<a href=" ">ダウンロード</a>」へ行き、使用している OS にあわせて、「thread-1.0-win.mxp」または「thread-1.0-mac.mxp」をダウンロードします。</li>68 <li>ActionScript Thread Library プロジェクトページの「<a href="http://www.libspark.org/wiki/Thread#download">ダウンロード</a>」へ行き、使用している OS にあわせて、「Thread-1.0-win.mxp」または「Thread-1.0-mac.mxp」をダウンロードします。</li> 69 69 <li>ダウンロードしたmxpを実行します。この時、FlashCS3のConfigurationディレクトリの場所(標準でWindowsは「C: /Program Files/Adobe/Adobe Flash CS3/ja/Configuration」Macは「/Applications/Adobe Flash CS3/Configuration」です)を聞かれますので選択してください。</li> 70 70 <li>インストールが無事完了すれば、Flash CS3 上のプロジェクトで ActionScript Thread Library (org.libspark.thread パッケージ) が使用可能になります。</li> 71 71 </ol> 72 72 73 <h4 >1-2-2. Flex Builder の場合 (swc パッケージ)</h4>73 <h4 id="installation-flexbuilder">1-2-2. Flex Builder の場合 (swc パッケージ)</h4> 74 74 75 75 <ol> 76 <li>ActionScript Thread Library プロジェクトページの「<a href=" ">ダウンロード</a>」へ行き、「thread-1.0.swc」をダウンロードします。</li>76 <li>ActionScript Thread Library プロジェクトページの「<a href="http://www.libspark.org/wiki/Thread#download">ダウンロード</a>」へ行き、「Thread-1.0.swc」をダウンロードします。</li> 77 77 <li>Flex Builder 上で、ActionScript Thread Library を使用したいプロジェクトを開くか、作成します。</li> 78 78 <li>プロジェクトのプロパティを表示し、「ActionScript ビルドパス」内の「ライブラリパス」タブを開きます。</li> 79 <li>「SWC の追加」ボタンをクリックし、表示されたダイアログ内で、ダウンロードした「 thread-1.0.swc」を指定して追加します。</li>79 <li>「SWC の追加」ボタンをクリックし、表示されたダイアログ内で、ダウンロードした「Thread-1.0.swc」を指定して追加します。</li> 80 80 <li>「OK」ボタンを押して設定を保存すれば完了です。設定したプロジェクトで ActionScript Thread Library (org.libspark.thread パッケージ) が使用可能になります。</li> 81 81 </ol> 82 82 83 <h4 >1-2-3. Flash Develop の場合 (swc パッケージ)</h4>83 <h4 id="installation-flashdevelop">1-2-3. Flash Develop の場合 (swc パッケージ)</h4> 84 84 85 85 <ol> 86 <li>ActionScript Thread Library プロジェクトページの「<a href=" ">ダウンロード</a>」へ行き、「thread-1.0.swc」をダウンロードします。</li>86 <li>ActionScript Thread Library プロジェクトページの「<a href="http://www.libspark.org/wiki/Thread#download">ダウンロード</a>」へ行き、「Thread-1.0.swc」をダウンロードします。</li> 87 87 <li>Flash Develop 上で、ActionScript Thread Library を使用したいプロジェクトを開くか、作成します。</li> 88 88 <li>プロジェクトのプロパティを表示し、「Compiler Options」タブを開きます。</li> 89 <li>「SWC Libraries」の所に、ダウンロードした「 thread-1.0.swc」を指定して追加します。</li>89 <li>「SWC Libraries」の所に、ダウンロードした「Thread-1.0.swc」を指定して追加します。</li> 90 90 <li>「OK」ボタンを押して設定を保存すれば完了です。設定したプロジェクトで ActionScript Thread Library (org.libspark.thread パッケージ) が使用可能になります。</li> 91 91 </ol> 92 92 93 <h4 >1-2-4. Flex SDK の場合 (swc パッケージ)</h4>93 <h4 id="installation-flexsdk">1-2-4. Flex SDK の場合 (swc パッケージ)</h4> 94 94 95 95 <ol> 96 <li>ActionScript Thread Library プロジェクトページの「<a href=" ">ダウンロード</a>」へ行き、「thread-1.0.swc」をダウンロードします。</li>97 <li>コンパイル時に、「library-path」オプションを使用して、ダウンロードした「 thread-1.0.swc」を追加します。このとき、「=」ではなく「+=」を使用することに注意して下さい。98 <pre class="code">mxmlc -library-path+= thread-1.0.swc MyApplication.as</pre></li>96 <li>ActionScript Thread Library プロジェクトページの「<a href="http://www.libspark.org/wiki/Thread#download">ダウンロード</a>」へ行き、「Thread-1.0.swc」をダウンロードします。</li> 97 <li>コンパイル時に、「library-path」オプションを使用して、ダウンロードした「Thread-1.0.swc」を追加します。このとき、「=」ではなく「+=」を使用することに注意して下さい。 98 <pre class="code">mxmlc -library-path+=Thread-1.0.swc MyApplication.as</pre></li> 99 99 <li>コンパイルするプロジェクト内で ActionScript Thread Library (org.libspark.thread パッケージ) が使用可能になります。</li> 100 100 </ol> 101 101 102 <h4 >1-2-5. その他の場合 (ソースアーカイブ)</h4>102 <h4 id="installation-src">1-2-5. その他の場合 (ソースアーカイブ)</h4> 103 103 104 104 <ol> 105 <li>ActionScript Thread Library プロジェクトページの「<a href=" ">ダウンロード</a>」へ行き、「thread-1.0-src.zip」をダウンロードするか、105 <li>ActionScript Thread Library プロジェクトページの「<a href="http://www.libspark.org/wiki/Thread#download">ダウンロード</a>」へ行き、「Thread-1.0-src.zip」をダウンロードするか、 106 106 或は最新のソースコードを使用したい場合は、Subversion 経由で以下のコマンドを利用してリポジトリから直接ソースコードを取得します。 107 107 <pre class="code">$ svn co http://www.libspark.org/svn/as3/Thread/src</pre></li> … … 110 110 </ol> 111 111 112 <h3 >1-3. スレッドライブラリの初期化</h3>113 114 <p>ActionScript Thread Library を使用するためには、まず最初に <a href=" ">Thread クラス</a>の <a href="">initialize メソッド</a>を呼び出してライブラリを初期化する必要があります。112 <h3 id="initialization">1-3. スレッドライブラリの初期化</h3> 113 114 <p>ActionScript Thread Library を使用するためには、まず最初に <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html">Thread クラス</a>の <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#initialize()">initialize メソッド</a>を呼び出してライブラリを初期化する必要があります。 115 115 特にが無ければ問題ドキュメントクラスのコンストラクタで初期化するのが良いでしょう。</p> 116 116 … … 130 130 }</pre> 131 131 132 <p><a href=" ">initialize メソッド</a>は、IThreadExecutor インターフェイスの実装クラスを引数に取ります。この設定は、「スレッドをいつ実行するか」を決める役割を持っています。133 詳しくは、「<a href=" ">2-5. スレッドの実行タイミングと IThreadExecutor</a>」で解説します。</p>132 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#initialize()">initialize メソッド</a>は、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/IThreadExecutor.html">IThreadExecutor インターフェイス</a>の実装クラスを引数に取ります。この設定は、「スレッドをいつ実行するか」を決める役割を持っています。 133 詳しくは、「<a href="#timing-of-thread-execution">2-6. スレッドの実行タイミングと IThreadExecutor</a>」で解説します。</p> 134 134 135 135 <p>もし、プロジェクトが複数の SWF ファイルに分割されている場合、それぞれの SWF ファイルのドキュメントクラスでライブラリの初期化をしてしまうと、意図しない挙動をすることがあります。 136 これを防ぐために、既にライブラリが初期化済みかを表す <a href=" ">isReady プロパティ</a>を用いて、既にライブラリが初期化されていた場合は、初期化をしないようにして下さい。</p>136 これを防ぐために、既にライブラリが初期化済みかを表す <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#isReady">isReady プロパティ</a>を用いて、既にライブラリが初期化されていた場合は、初期化をしないようにして下さい。</p> 137 137 138 138 <pre class="code">public class MyDocumentClass extends MovieClip … … 148 148 <hr /> 149 149 150 <h2 >2. スレッドの使用</h2>151 152 <h3 >2-1. スレッドの作成</h3>153 154 <p>スレッドを使うためには、まずスレッドを作らなければなりません。予め用意されているいくつかのスレッド (<a href=" ">URLLoaderThread クラス</a>や <a href="">TweenerThread クラス</a>)150 <h2 id="using-thread">2. スレッドの使用</h2> 151 152 <h3 id="creating-thraed">2-1. スレッドの作成</h3> 153 154 <p>スレッドを使うためには、まずスレッドを作らなければなりません。予め用意されているいくつかのスレッド (<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/threads/net/URLLoaderThread.html">URLLoaderThread</a> や <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/threads/tweener/TweenerThread.html">TweenerThread</a>) 155 155 を使用する場合でも、それ単体で使用する場合というのは稀で、ほとんどの場合、「<strong>そのスレッドを使うためのスレッド</strong>」を自分で書くことになります。</p> 156 156 157 <p>独自のスレッドを書くためには、まず <strong><a href=" ">Thraed クラス</a>を継承したサブクラスを作成</strong>します。158 そして、<strong><a href=" ">run メソッド</a>をオーバーライドして処理を記述</strong>します。</p>157 <p>独自のスレッドを書くためには、まず <strong><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html">Thread クラス</a>を継承したサブクラスを作成</strong>します。 158 そして、<strong><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>をオーバーライドして処理を記述</strong>します。</p> 159 159 160 160 <p>次の例では、実行すると「Hello」と出力する、MyThread というスレッドを作成しています。</p> … … 170 170 }</pre> 171 171 172 <h3 >2-2. スレッドの実行</h3>172 <h3 id="executing-thread">2-2. スレッドの実行</h3> 173 173 174 174 <p>スレッドを実行したい場合、まずはじめに、new 演算子を使用して実行したいスレッドのインスタンスを作成します。</p> … … 176 176 <pre class="code">var t:MyThread = new MyThread();</pre> 177 177 178 <p>スレッドは、<strong>インスタンスを作成しただけでは実行されません</strong>。実行を開始したいタイミングで、 <a href=" ">start メソッド</a>を呼び出すことで、はじめて実行を開始します。</p>178 <p>スレッドは、<strong>インスタンスを作成しただけでは実行されません</strong>。実行を開始したいタイミングで、 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>を呼び出すことで、はじめて実行を開始します。</p> 179 179 180 180 <pre class="code">t.start();</pre> 181 181 182 <p> <a href="">MyThread クラス</a>は実行すると「Hello」と出力するスレッドでしたので、start メソッドが呼び出されたあと、「Hello」と出力され、スレッドが終了します。</p>183 184 <h3 >2-3. 実行関数</h3>185 186 <p>スレッドの実行が開始されると呼び出されるメソッドのことを、「<strong>実行関数</strong>」と呼びます。実行関数の中では、<a href=" ">next メソッド</a>を用いて、182 <p>MyThread クラスは実行すると「Hello」と出力するスレッドでしたので、start メソッドが呼び出されたあと、「Hello」と出力され、スレッドが終了します。</p> 183 184 <h3 id="execution-function">2-3. 実行関数</h3> 185 186 <p>スレッドの実行が開始されると呼び出されるメソッドのことを、「<strong>実行関数</strong>」と呼びます。実行関数の中では、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>を用いて、 187 187 <strong>次に実行する実行関数</strong>を設定することができ、スレッドの実行は<strong>実行関数が設定される限り継続</strong>します。</p> 188 188 189 <p><a href=" ">run メソッド</a>をオーバーライドして処理を記述したことからも分かるように、実行関数はまずはじめに <a href="">run メソッド</a>に設定されます。190 次の例では、<a href=" ">run メソッド</a>の中で <a href="">next メソッド</a>を用いて、world メソッドを次の実行関数に設定しています。</p>189 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>をオーバーライドして処理を記述したことからも分かるように、実行関数はまずはじめに <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>に設定されます。 190 次の例では、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>の中で <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>を用いて、world メソッドを次の実行関数に設定しています。</p> 191 191 192 192 <pre class="code">public class MyThread extends Thread … … 206 206 }</pre> 207 207 208 <p>このスレッドを実行すると、まずはじめに最初の実行関数である <a href=" ">run メソッド</a>が呼び出されて「Hello」が出力され、208 <p>このスレッドを実行すると、まずはじめに最初の実行関数である <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>が呼び出されて「Hello」が出力され、 209 209 続いて、次の実行関数である world メソッドが呼び出されて「, World!」が出力され、スレッドの実行が終了します。</p> 210 210 211 211 <p>実行関数が次々に呼び出されるというこの仕組みが、ActionScript Thread Library の最も基本的で大事な部分です。 212 <a href=" ">next メソッド</a>の他にも様々なメソッドが用意されており、それを使用することで、スレッドの動作をより細かく制御することができるようになります。213 詳しくは、「<a href=" ">2-5. スレッドの待機</a>」や「<a href="">4. スレッドの制御</a>」で解説します。</p>214 215 <h3 >2-4. 複数のスレッドの実行</h3>212 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>の他にも様々なメソッドが用意されており、それを使用することで、スレッドの動作をより細かく制御することができるようになります。 213 詳しくは、「<a href="#waiting-thread">2-5. スレッドの待機</a>」や「<a href="#controling-thread">4. スレッドの制御</a>」で解説します。</p> 214 215 <h3 id="executing-multiple-threads">2-4. 複数のスレッドの実行</h3> 216 216 217 217 <p>ActionScript Thread Library は擬似的なマルチスレッドを実現するライブラリですので、もちろん同時に複数のスレッドを実行することが出来ます。 218 複数のスレッドを実行するには、実行したい分だけスレッドのインスタンスを作り、それぞれの <a href=" ">start メソッド</a>を呼び出して実行を開始します。219 ひとつのスレッドのインスタンスに対して、<a href=" ">start メソッド</a>を複数回呼び出すことは出来ないので注意して下さい。</p>218 複数のスレッドを実行するには、実行したい分だけスレッドのインスタンスを作り、それぞれの <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>を呼び出して実行を開始します。 219 ひとつのスレッドのインスタンスに対して、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>を複数回呼び出すことは出来ないので注意して下さい。</p> 220 220 221 221 <p>実行が開始されたスレッドは、そのスレッドが終了するまで、他のスレッドの干渉や影響を受けることなく、実行を続けます。</p> … … 274 274 6</pre> 275 275 276 <h3 >2-5. スレッドの待機</h3>276 <h3 id="waiting-thread">2-5. スレッドの待機</h3> 277 277 278 278 <p>スレッドには、ある特定の状態になるまで、実行を中断して待機するための機能が存在します。実行を中断する、とは「<strong>実行関数の呼び出しを止める</strong>」ということで、 279 279 このような状態を「<strong>待機状態</strong>」と呼びます。</p> 280 280 281 <p>スレッドを待機させるメソッドはいくつかありますが、最も簡単な例が <a href=" ">sleep メソッド</a>です。281 <p>スレッドを待機させるメソッドはいくつかありますが、最も簡単な例が <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>です。 282 282 このメソッドは、指定された時間が経過するまでスレッドの実行を中断して待機させます。</p> 283 283 284 <p>次の例では、「Hello」と出力したあと、<a href=" ">sleep メソッド</a>を用いて 1 秒間待機し、「World」を出力します。</p>284 <p>次の例では、「Hello」と出力したあと、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>を用いて 1 秒間待機し、「World」を出力します。</p> 285 285 286 286 <pre class="code">public class MyThread extends Thread … … 302 302 }</pre> 303 303 304 <p>注意しなければならないのは、<strong><a href=" ">sleep メソッド</a>を呼び出したその時点でコードの実行が中断されるわけではない</strong>ということです。305 それではいつ実行が中断されるかというと、<strong>今実行中の実行関数 (ここでは <a href=" ">run メソッド</a>) の処理が全て終わった時にはじめて中断され、304 <p>注意しなければならないのは、<strong><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>を呼び出したその時点でコードの実行が中断されるわけではない</strong>ということです。 305 それではいつ実行が中断されるかというと、<strong>今実行中の実行関数 (ここでは <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>) の処理が全て終わった時にはじめて中断され、 306 306 ある状態になるまで (ここでは 1 秒経過するまで) 、次の実行関数の実行が遅延されます</strong>。</p> 307 307 308 <p>すなわち、上の例では、<a href=" ">sleep メソッド</a>が呼び出されたあと、<a href="">next メソッド</a>によって次の実行関数 (world メソッド) が設定された上で、308 <p>すなわち、上の例では、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>が呼び出されたあと、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>によって次の実行関数 (world メソッド) が設定された上で、 309 309 待機状態に移行して実行を中断し、1 秒経過するのを待って実行を再開し、次の実行関数である world メソッドが呼び出される、という流れになります。</p> 310 310 311 311 <p>このように、ActionScript Thread Library では、途中にスレッドの待機が入る場合に、 312 <strong>待機後の処理を書きたい場合は、実行関数を分割して <a href=" ">next メソッド</a>で設定するのが定石</strong>となりますのでよく覚えておいて下さい。</p>313 314 <p><a href=" ">sleep メソッド</a>以外のメソッドについては、「<a href="">4. スレッドの制御</a>」や「<a href="">5. モニタ機構</a>」で解説します。</p>315 316 <h3 >2-6. スレッドの実行タイミングと IThreadExecutor</h3>312 <strong>待機後の処理を書きたい場合は、実行関数を分割して <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>で設定するのが定石</strong>となりますのでよく覚えておいて下さい。</p> 313 314 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>以外のメソッドについては、「<a href="#controling-thread">4. スレッドの制御</a>」や「<a href="#monitor-system">5. モニタ機構</a>」で解説します。</p> 315 316 <h3 id="timing-of-thread-execution">2-6. スレッドの実行タイミングと IThreadExecutor</h3> 317 317 318 318 <img class ="figure" src="img/thread-execution.png" alt="" width="300" height="350" /> 319 319 320 320 <p>スレッドを使いこなすためには、<strong>実行関数が実行されるタイミング</strong>というものを、ある程度意識する必要があります。 321 これには、「<a href=" ">1-3. スレッドライブラリの初期化</a>」でも出てきた、<a href="">IThreadExecutor インターフェイス</a>の実装クラスが深く関わっています。</p>322 323 <p>ActionScript Thread Library には、標準で <a href=" ">EnterFrameThreadExecutor</a> と <a href="">IntervalThreadExecutor</a> というふたつの IThreadExecutor インターフェイス実装クラスが用意されています。321 これには、「<a href="#initialization">1-3. スレッドライブラリの初期化</a>」でも出てきた、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/IThreadExecutor.html">IThreadExecutor インターフェイス</a>の実装クラスが深く関わっています。</p> 322 323 <p>ActionScript Thread Library には、標準で <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/EnterFrameThreadExecutor.html">EnterFrameThreadExecutor</a> と <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/IntervalThreadExecutor.html">IntervalThreadExecutor</a> というふたつの <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/IThreadExecutor.html">IThreadExecutor インターフェイス</a>実装クラスが用意されています。 324 324 これらはそれぞれ、「<strong>フレーム実行のタイミング (Event.ENTER_FRAME のタイミング)</strong>」と「<strong>指定された時間の間隔のタイミング</strong>」で、 325 325 <strong>その時点までに開始されている全てのスレッドの実行関数を呼び出す</strong>クラスです。</p> … … 327 327 <p>たとえば、初期化時に EnterFrameThreadExecutor を指定していて、スレッド A とスレッド B が開始されている場合、フレームが実行される (Event.ENTER_FRAME が発生する) 度に、スレッド A とスレッド B の実行関数が呼び出されることになります。</p> 328 328 329 <p>実行関数が呼び出される順番は、<strong>スレッドが開始された順</strong>です。ただし、スレッドに親子関係がある場合は、それが考慮されます。詳しくは「<a href=" ">3-2. 親子関係のあるスレッドの実行順序</a>」で解説します。</p>329 <p>実行関数が呼び出される順番は、<strong>スレッドが開始された順</strong>です。ただし、スレッドに親子関係がある場合は、それが考慮されます。詳しくは「<a href="#execution-order-of-thread-hierarchy">3-2. 親子関係のあるスレッドの実行順序</a>」で解説します。</p> 330 330 331 331 <p>このように、ActionScript Thread Library では、<strong>スレッドの実行タイミングと実行順序は完全に決まっており</strong>、本当のマルチスレッドのように、 332 332 実行されるタイミングや、実行される順序が不定ということはありません。</p> 333 333 334 <h3 >2-7. 現在のスレッド</h3>335 336 <p>あるスレッドの実行関数が実行されているとき、そのスレッドは「<strong>現在実行されているスレッド</strong> (現在のスレッド)」として <a href=" ">currentThread プロパティ</a>に設定されます。337 スレッドの実行関数内で <a href=" ">currentThread プロパティ</a>を参照したとき、それは必ず自分自身 (this) になります。</p>338 339 <p>どのスレッドの実行関数も実行されていない、つまり現在実行されているスレッドが無い場合は、<a href=" ">currentThread プロパティ</a>は null を返します。</p>340 341 <p>「現在のスレッド」は、<a href=" ">next メソッド</a>をはじめとする、<a href="">Thread クラス</a>に静的 (static) なメソッドとして定義されているいくつかのメソッド呼び出しに於いて重要な意味を持ちます。334 <h3 id="current-thread">2-7. 現在のスレッド</h3> 335 336 <p>あるスレッドの実行関数が実行されているとき、そのスレッドは「<strong>現在実行されているスレッド</strong> (現在のスレッド)」として <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#currentThread">currentThread プロパティ</a>に設定されます。 337 スレッドの実行関数内で <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#currentThread">currentThread プロパティ</a>を参照したとき、それは必ず自分自身 (this) になります。</p> 338 339 <p>どのスレッドの実行関数も実行されていない、つまり現在実行されているスレッドが無い場合は、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#currentThread">currentThread プロパティ</a>は null を返します。</p> 340 341 <p>「現在のスレッド」は、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>をはじめとする、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html">Thread クラス</a>に静的 (static) なメソッドとして定義されているいくつかのメソッド呼び出しに於いて重要な意味を持ちます。 342 342 これらのメソッドは、「現在のスレッド」に対して設定をするようになっており、すなわちそれ以外のスレッドからは設定が出来ないようになっています。</p> 343 343 344 <p>たとえば、スレッド A とスレッド B が実行されているときに、スレッド B の実行関数から、スレッド A の <a href=" ">next メソッド</a>を呼び出して、スレッド A の次の実行関数を変更する、といったことは出来ません。</p>344 <p>たとえば、スレッド A とスレッド B が実行されているときに、スレッド B の実行関数から、スレッド A の <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#next()">next メソッド</a>を呼び出して、スレッド A の次の実行関数を変更する、といったことは出来ません。</p> 345 345 346 346 <p>外部のスレッドによって意図せずスレッドの動作が変えられてしまわないように、このような設計になっています。</p> 347 347 348 <h3 >2-8. スレッドの終了処理</h3>348 <h3 id="finalization">2-8. スレッドの終了処理</h3> 349 349 350 350 <p>スレッドは、常に安全に終了することが求められます。たとえば、スレッドを実行する中で確保されたリソースがあれば、それはスレッドが終了する時にはきちんと解放されていることが望ましいでしょう。</p> 351 351 352 <p>このような終了処理を確実に行うために、ActionScript Thread Library には <a href=" ">finalize メソッド</a>が用意されています。352 <p>このような終了処理を確実に行うために、ActionScript Thread Library には <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#finalize()">finalize メソッド</a>が用意されています。 353 353 これは、「<strong>終了処理を行うための実行関数</strong>」です。</p> 354 354 355 <p>次に実行する実行関数が設定されなかった場合、スレッドはそのまま終了するのではなく、実際には <a href=" ">finalize メソッド</a> を次の実行関数に設定して実行し、356 そこで次に実行する実行関数が設定されなかった場合に、本当に終了します。<a href=" ">finalize メソッド</a>は、例外が発生した場合でも実行されることが保証されているので、357 確実に終了処理を行うことが出来ます (例外については「<a href=" ">7. 例外</a>」で解説します)。</p>358 359 <p>次の例では、<a href=" ">finalize メソッド</a>を用いて、スレッドの実行中に確保した BitmapData が確実に解放されるようにしています。360 実行関数 something の実行が終了すると、自動的に <a href=" ">finalize メソッド</a>が呼び出されます。</p>355 <p>次に実行する実行関数が設定されなかった場合、スレッドはそのまま終了するのではなく、実際には <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#finalize()">finalize メソッド</a> を次の実行関数に設定して実行し、 356 そこで次に実行する実行関数が設定されなかった場合に、本当に終了します。<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#finalize()">finalize メソッド</a>は、例外が発生した場合でも実行されることが保証されているので、 357 確実に終了処理を行うことが出来ます (例外については「<a href="#exceptions">7. 例外</a>」で解説します)。</p> 358 359 <p>次の例では、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#finalize()">finalize メソッド</a>を用いて、スレッドの実行中に確保した BitmapData が確実に解放されるようにしています。 360 実行関数 something の実行が終了すると、自動的に <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#finalize()">finalize メソッド</a>が呼び出されます。</p> 361 361 362 362 <pre class="code">public class MyThread extends Thread … … 384 384 }</pre> 385 385 386 <p><a href=" ">run メソッド</a>からはじまる実行関数の実行の流れを「<strong>実行フェーズ</strong>」と呼び、実行フェーズが終了した後の、387 <a href=" ">finalize メソッド</a>からはじまる実行関数の実行の流れを「<strong>終了フェーズ</strong>」と呼びます。386 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>からはじまる実行関数の実行の流れを「<strong>実行フェーズ</strong>」と呼び、実行フェーズが終了した後の、 387 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#finalize()">finalize メソッド</a>からはじまる実行関数の実行の流れを「<strong>終了フェーズ</strong>」と呼びます。 388 388 終了フェーズが終了すると、スレッドは終了します。スレッドが終了フェーズから実行フェーズに戻ることはありません。</p> 389 389 390 <h3 >2-9. スレッドの状態</h3>390 <h3 id="state-of-thread">2-9. スレッドの状態</h3> 391 391 392 392 <img class="figure" src="img/state-chart.gif" alt="" width="300" height="450" /> 393 393 394 <p>スレッドはある時点で、以下のいずれかの状態を取ります。これらの値は <a href=" ">ThreadState</a> クラスで定義されており、実際の状態は <a href="">state プロパティ</a>を通して知ることが出来ます。</p>394 <p>スレッドはある時点で、以下のいずれかの状態を取ります。これらの値は <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/ThreadState.html">ThreadState クラス</a>で定義されており、実際の状態は <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#state">state プロパティ</a>を通して知ることが出来ます。</p> 395 395 396 396 <ul> … … 403 403 </ul> 404 404 405 <p>スレッドが生成されると、まずはじめに、状態は「NEW」に設定されます。このあと、<a href=" ">start メソッド</a>によってスレッドが開始されると、状態は「RUNNABLE」に設定され、実行フェーズとなります。406 「NEW」以外の状態のスレッドを <a href=" ">start メソッド</a>によって開始することはできず、万が一 <a href="">start メソッド</a>を呼び出してしまった場合、 <a href="">IllegalThreadStateError</a> 例外がスローされます。</p>407 408 <p><a href=" ">wait メソッド</a>、<a href="">join メソッド</a>等の呼び出しによってスレッドが待機状態になる場合 (詳しくは「<a href="">4. スレッドの制御</a>」を参照してください) 状態は「WAITING」に設定されます。409 このとき、制限時間が設定されるか、または<a href=" ">sleep メソッド</a>の呼び出しであった場合、状態は「TIMED_WAITING」に設定されます。待機状態が解除されると、状態は元に戻ります。</p>405 <p>スレッドが生成されると、まずはじめに、状態は「NEW」に設定されます。このあと、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>によってスレッドが開始されると、状態は「RUNNABLE」に設定され、実行フェーズとなります。 406 「NEW」以外の状態のスレッドを <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>によって開始することはできず、万が一 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>を呼び出してしまった場合、 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/errors/IllegalThreadStateError.html">IllegalThreadStateError 例外</a>がスローされます。</p> 407 408 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Monitor.html#wait()">wait メソッド</a>、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#join()">join メソッド</a>等の呼び出しによってスレッドが待機状態になる場合 (詳しくは「<a href="#controling-thread">4. スレッドの制御</a>」を参照してください) 状態は「WAITING」に設定されます。 409 このとき、制限時間が設定されるか、または<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>の呼び出しであった場合、状態は「TIMED_WAITING」に設定されます。待機状態が解除されると、状態は元に戻ります。</p> 410 410 411 411 <p>スレッドが終了フェーズに移行すると、状態は「TERMINATING」に設定されます。スレッドが終了フェーズから実行フェーズに戻ることはないので、 … … 416 416 <hr /> 417 417 418 <h2 >3. スレッドの親子関係</h2>419 420 <h3 >3-1. スレッドの親子関係の決定</h3>421 422 <p>スレッドの親子関係は、スレッドの実行開始時に決定されます。あるスレッドの実行中に別のスレッドの実行を開始した (<a href=" ">start メソッド</a>を呼び出した) 場合、423 実行を開始させた (<a href=" ">start メソッド</a>を呼び出した) スレッドは「<strong>親スレッド</strong>」となり、実行が開始された (<a href="">start メソッド</a>が呼び出された) スレッドはその「<strong>子スレッド</strong>」となります。</p>424 425 <p>スレッドの親子関係は、実行順序と例外の伝播において重要になります。詳しくはそれぞれ「<a href=" ">3-2. 親子関係のあるスレッドの実行順序</a>」と「<a href="">7-x. 例外の伝播</a>」で解説します。</p>418 <h2 id="thread-hierarchy">3. スレッドの親子関係</h2> 419 420 <h3 id="decision-of-thread-hierarchy">3-1. スレッドの親子関係の決定</h3> 421 422 <p>スレッドの親子関係は、スレッドの実行開始時に決定されます。あるスレッドの実行中に別のスレッドの実行を開始した (<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>を呼び出した) 場合、 423 実行を開始させた (<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>を呼び出した) スレッドは「<strong>親スレッド</strong>」となり、実行が開始された (<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#start()">start メソッド</a>が呼び出された) スレッドはその「<strong>子スレッド</strong>」となります。</p> 424 425 <p>スレッドの親子関係は、実行順序と例外の伝播において重要になります。詳しくはそれぞれ「<a href="#execution-order-of-thread-hierarchy">3-2. 親子関係のあるスレッドの実行順序</a>」と「<a href="#exceptions">7. 例外</a>」で解説します。</p> 426 426 427 427 <p>どのスレッドも実行されていない状態でスレッドの実行が開始された場合、つまり親スレッドがいない場合、そのスレッドは「<strong>トップレベルスレッド</strong>」となります。</p> … … 448 448 a.start();</pre> 449 449 450 <h3 >3-2. 親子関係のあるスレッドの実行順序</h3>450 <h3 id="execution-order-of-thread-hierarchy">3-2. 親子関係のあるスレッドの実行順序</h3> 451 451 452 452 <p>あるスレッドに子スレッドが存在する場合、そのスレッドよりも先に子スレッドが実行され、その後でそのスレッドが実行されます。 … … 501 501 a.start();</pre> 502 502 503 <h3 >3-3. 孤児スレッド</h3>503 <h3 id="orphan-thread">3-3. 孤児スレッド</h3> 504 504 505 505 <p>子スレッドよりも先に親スレッドが終了した場合、その子スレッドは「<strong>孤児スレッド</strong>」となり、トップレベルスレッドとして再配置されます。 … … 508 508 <hr /> 509 509 510 <h2 >4. スレッドの制御</h2>511 512 <h3 >4-1. スレッドの終了待ち</h3>513 514 <p>あるスレッドの<a href=" ">join メソッド</a>を呼び出すと、そのスレッドが終了するまで、<a href="">join メソッド</a>を呼び出したスレッドを待機させることができます。515 待機について詳しくは「<a href=" ">2-5. スレッドの待機</a>」を参照して下さい。</p>510 <h2 id="controling-thread">4. スレッドの制御</h2> 511 512 <h3 id="joining-thread">4-1. スレッドの終了待ち</h3> 513 514 <p>あるスレッドの<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#join()">join メソッド</a>を呼び出すと、そのスレッドが終了するまで、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#join()">join メソッド</a>を呼び出したスレッドを待機させることができます。 515 待機について詳しくは「<a href="#waiting-thread">2-5. スレッドの待機</a>」を参照して下さい。</p> 516 516 517 517 <p>次の例では、スレッド MyThread の中で、「Start」を出力したあと、数字を 5 までカウントする CountThread を開始し、終了を待ってから「End」を出力します。</p> … … 566 566 End</pre> 567 567 568 <h3 >4-2. 指定時間の待機</h3>569 570 <p><a href=" ">sleep メソッド</a>を呼び出すと、指定時間が経過するまで、<a href="">sleep メソッド</a>を呼び出したスレッドを待機させることができます。571 待機について詳しくは「<a href=" ">2-5. スレッドの待機</a>」を参照して下さい。</p>568 <h3 id="sleeping">4-2. 指定時間の待機</h3> 569 570 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>を呼び出すと、指定時間が経過するまで、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#sleep()">sleep メソッド</a>を呼び出したスレッドを待機させることができます。 571 待機について詳しくは「<a href="#waiting-thread">2-5. スレッドの待機</a>」を参照して下さい。</p> 572 572 573 573 <p>次の例では、スレッド MyThread で、1 秒ごとにカウントを 1 ずつ増やしながらそれを出力します。</p> … … 596 596 t.start();</pre> 597 597 598 <h3 >4-3. イベント</h3>599 600 <p><a href=" ">event メソッド</a>を呼び出すと、指定されたイベントが発生するまで、<a href="">event メソッド</a>を呼び出したスレッドを待機させ、598 <h3 id="waiting-event">4-3. イベント</h3> 599 600 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#event()">event メソッド</a>を呼び出すと、指定されたイベントが発生するまで、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#event()">event メソッド</a>を呼び出したスレッドを待機させ、 601 601 イベントが発生した際には、指定されたメソッドを実行関数として実行を再開させることが出来ます。 602 待機について詳しくは「<a href=" ">2-5. スレッドの待機</a>」を参照して下さい。</p>602 待機について詳しくは「<a href="#waiting-thread">2-5. スレッドの待機</a>」を参照して下さい。</p> 603 603 604 604 <p>次の例では、スレッド MyThread で、Stage クラスのインスタンスに対してイベントハンドラを設定し、クリックした (MouseEvent.CLICK) 際には … … 636 636 t.start();</pre> 637 637 638 <p><a href=" ">event メソッド</a>によって設定される実行関数は特殊で、通常のイベントハンドラと同様、発生したイベントを引数として取る必要があります。638 <p><a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#event()">event メソッド</a>によって設定される実行関数は特殊で、通常のイベントハンドラと同様、発生したイベントを引数として取る必要があります。 639 639 その他の部分では通常の実行関数と違いは無く、全く同じ振る舞いをします。 640 ここでは click メソッドと keyDown メソッド共に、次の実行関数を <a href=" ">run メソッド</a>に設定しているため、これらのメソッドが実行された後、641 <a href=" ">run メソッド</a>が実行され、再びイベント待ちをすることになります。</p>642 643 <hr /> 644 645 <h2 >5. モニタ機構</h2>640 ここでは click メソッドと keyDown メソッド共に、次の実行関数を <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>に設定しているため、これらのメソッドが実行された後、 641 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html#run()">run メソッド</a>が実行され、再びイベント待ちをすることになります。</p> 642 643 <hr /> 644 645 <h2 id="monitor-system">5. モニタ機構</h2> 646 646 647 647 <p>スレッドの待機と再開を自分の手でコントロールしたい場合、モニタ機構を使用することが出来ます。これは特に、複数のスレッドの協調動作をさせたい場合に役立ちます。</p> 648 648 649 <p>モニタ機構は、<a href=" ">IMonitor インターフェイス</a>の実装クラスによって提供されます。ActionScript Thread Library には、650 <a href=" ">IMonitor インターフェイス</a>の標準の実装である <a href="">Monitor クラス</a>が用意されており、更に <a href="">Thread クラス</a>は651 <a href=" ">Monitor クラス</a>を継承しているので、このどちらかを使用するのが簡単です。</p>652 653 <p>モニタ機構を簡単に説明すると、<a href=" ">wait メソッド</a>を呼び出したスレッドを、654 <a href=" ">notify メソッド</a>もしくは <a href="">notifyAll メソッド</a>が呼び出されるまで待機させるものです。655 待機について詳しくは「<a href=" ">2-5. スレッドの待機</a>」を参照して下さい。</p>656 657 <p>あるモニタの <a href=" ">wait メソッド</a>を呼び出したスレッドは、そのモニタの「待機セット」と呼ばれる待合室に入り、658 待機状態に移行します。そして、別の誰かがそのモニタの <a href=" ">notify メソッド</a> を呼び出すと、649 <p>モニタ機構は、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/IMonitor.html">IMonitor インターフェイス</a>の実装クラスによって提供されます。ActionScript Thread Library には、 650 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/IMonitor.html">IMonitor インターフェイス</a>の標準の実装である <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Monitor.html">Monitor クラス</a>が用意されており、更に <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Thread.html">Thread クラス</a>は 651 <a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Monitor.html">Monitor クラス</a>を継承しているので、このどちらかを使用するのが簡単です。</p> 652 653 <p>モニタ機構を簡単に説明すると、<a href="http://www.libspark.org/htdocs/as3/thread/org/libspark/thread/Monitor.html#wait()">wait メソッド</a>を呼び出したスレッドを、 654 <a href="http://www.libspark.org/htdocs/as3/thread/org/libsp