| Package | org.libspark.thread |
| Class | public class Thread |
| Inheritance | Thread Monitor |
| Subclasses | CommandThread, EventDispatcherThread, Executor, Frocessing2DThread, Frocessing3DThread, LoaderThread, SoundLoaderThread, TweenerThread, URLLoaderThread |
ここで実現される擬似スレッドは、タスクシステムと Java のスレッドモデルをベースとしています。 処理をいくつかのメソッドに切り分け、呼び出すメソッド (「実行関数」と呼びます) を切り替えつつ 順々に実行していくことで、処理を進めます。
新しいスレッドを作成するためには、まず Thread クラスのサブクラスを作成します。 このサブクラスは、 Thread クラスの run メソッドをオーバーライドする必要があります。 たとえば、「Hello, Thread!!」と出力するスレッドは、次のようになります。
public class HelloThread extends Thread
{
override protected function run():void
{
trace('Hello, Thread!!');
}
}作成したスレッドを実行するためには、 Thread Library を初期化する必要があります。 次のように、 Thread クラスの静的メソッド initialize を呼び出すことで初期化を行います。 このとき、引数に IThreadExecutor インターフェイスの実装クラスのインスタンスを指定します。 この IThreadExecutor インスタンスは、「いつスレッドを実行するか」を決める重要な役割を担っています。 ここでは、 EnterFrameThreadExecutor クラスのインスタンスを渡し、フレーム実行のタイミングで スレッドが実行されるようにしています。初期化処理は、アプリケーションの最初で一度だけ行えば、その後呼び出す必要はありません。
Thread.initialize(new EnterFrameThreadExecutor());
最後に、次のように HelloThread クラスのインスタンスを作り、 start メソッドを呼び出すことで、 スレッドの実行を開始します。
var t:Thread = new HelloThread(); t.start();
スレッドは親子関係を形成します。この親子関係は、スレッドの実行開始時に決定されます。 スレッドの start を呼び出したスレッド (つまりカレントスレッド) は、親スレッドとなり、 start が呼び出されたスレッドは、その親スレッドの子スレッドとなります。 ただし、 start の呼び出しがスレッドの外 (つまりカレントスレッドが null のとき) に行われた場合、 start が呼び出されたスレッドはトップレベルスレッドとなります。
スレッドの親子関係は、スレッドの実行順序と例外の伝播において重要になります。 スレッドの実行は、一番最初に開始されたトップレベルスレッドから始まります。今、このスレッドを A と呼ぶことにします。 A に子スレッドがいる場合、 A の実行よりも先にまず、子スレッドが、開始された順番で実行されます。 この子スレッドが実行されるとき、その子スレッドにさらに子スレッド (Aから見て孫スレッド) がいる場合、 その子スレッドの実行より先に孫スレッドが開始された順番で実行され、これが子スレッドがいなくなるまで続けられます。 全ての A の子スレッドの実行が終了すると、 A が実行され、次に、A の次に開始されたトップレベルスレッドの実行が 同様にして続きます。
スレッド内で例外が発生し、その例外が、例外が発生したスレッド内で捕捉されなかった場合、 例外は親スレッドに伝播します。例外が発生したのがトップレベルスレッドで、親スレッドがいない場合、 例外は uncaughtErrorHandler に渡されます。
子スレッドよりも先に親スレッドが終了した場合、その親スレッドの全ての子スレッドは孤児スレッドとなり、 トップレベルスレッドとして再配置されます。
スレッドはある時点で、以下のいずれかの状態を取ります。これらの値は ThreadState クラスで定義されており、 state プロパティを通して知ることができます。
スレッドが生成されると、まずはじめに状態は「NEW」に設定されます。この後、 start メソッドによって スレッドが開始されると、状態は「RUNNABLE」に設定されます。「NEW」以外の状態のスレッドを start メソッドによって 開始することはできません。
wait メソッド、 join メソッド等の呼び出しによってスレッドが待機状態になる場合、状態は「WAITING」に 設定されます。このとき、タイムアウトが設定されるか、sleep メソッドの呼び出しである場合、状態は「TIMED_WAITING」に 設定されます。待機状態が解除されると状態は元に戻ります。
スレッドが終了フェーズに移行すると、状態は「TERMINATING」に設定されます。スレッドが終了フェーズから 実行フェーズに戻ることは無く、同様に状態が「TERMINATING」から「RUNNABLE」に戻ることもありません。 終了フェーズが終わり、完全にスレッドが終了すると、状態は「TERMINATED」に設定されます。
スレッドの動作を視覚的に知りたい場合、以下の動作チャートを見ることをお勧めします。
See also
| Property | Defined by | ||
|---|---|---|---|
| className : String [read-only]
このスレッドのクラス名を返します.
| Thread | ||
| currentThread : Thread
[static][read-only]
現在実行中のスレッドを返します.
| Thread | ||
| id : uint [read-only]
このスレッドのユニークな識別子を返します.
| Thread | ||
| isInterrupted : Boolean [read-only]
このスレッドが割り込まれている場合は true、そうでない場合は false を返します.
| Thread | ||
| isReady : Boolean [static][read-only]
initialize メソッドの呼び出しによって IThreadExecutor が設定され、スレッドが実行可能な状態であれば true、そうでなければ false を返します.
| Thread | ||
| name : String
このスレッドの名前を設定します.
| Thread | ||
| state : uint [read-only]
このスレッドの状態を返します.
| Thread | ||
| uncaughtErrorHandler : Function [static]
どのスレッドにも捕捉されなかった例外のためのハンドラを設定します.
| Thread | ||
| Method | Defined by | ||
|---|---|---|---|
|
Thread()
新しい Thread クラスのインスタンスを生成します.
| Thread | ||
|
checkInterrupted():Boolean
[static]
現在のスレッドが割り込まれているかどうかを調べます.
| Thread | ||
|
error(klass:Class, func:Function, reset:Boolean = true):void
[static]
現在実行中のスレッドおよびその子スレッドで例外が発生した場合に実行する実行関数を設定します.
| Thread | ||
|
event(dispatcher:IEventDispatcher, type:String, func:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
[static]
現在実行中のスレッドが指定されたイベントが発生した場合に実行する実行関数を設定します.
| Thread | ||
|
executeAllThreads():void
[static]
全てのスレッドを実行します.
| Thread | ||
|
initialize(executor:IThreadExecutor):void
[static]
スレッドライブラリを初期化します.
| Thread | ||
|
interrupt():void
このスレッドに割り込みます.
| Thread | ||
|
interrupted(func:Function):void
[static]
現在実行中のスレッドが待機中に割り込まれた場合に実行する実行関数を設定します.
| Thread | ||
|
join(timeout:uint = 0):Boolean
このスレッドが終了するまで、現在のスレッドを待機させます.
| Thread | ||
![]() |
待機中に例外が発生した等の理由で、指定されたスレッドがこのモニタの待機セットから抜けることを伝えます.
| Monitor | |
|
next(func:Function):void
[static]
現在実行中のスレッドが次に実行する実行関数を設定します.
| Thread | ||
![]() |
notify():void
このモニターで待機中のスレッドを 1 つ再開します.
| Monitor | |
![]() |
notifyAll():void
このモニターで待機中のすべてのスレッドを再開します.
| Monitor | |
|
sleep(time:uint):void
[static]
現在実行中のスレッドの実行を、指定された時間だけ中断させます.
| Thread | ||
|
start():void
スレッドを開始します.
| Thread | ||
|
timeout(func:Function):void
[static]
現在実行中のスレッドが待機中にタイムアウトした場合に実行する実行関数を設定します.
| Thread | ||
|
toString():String
このスレッドの文字列表現を返します.
| Thread | ||
![]() |
wait(timeout:uint = 0):void
別のスレッドがこのモニターの notify メソッドまたは notifyAll メソッドを呼び出すか、指定された時間が経過するまで、現在のスレッドを待機させます.
| Monitor | |
| Method | Defined by | ||
|---|---|---|---|
|
finalize():void
このメソッドをオーバーライドして、スレッドの終了処理を記述します.
| Thread | ||
|
formatName(name:String):String
このスレッドの名前を整形して返します.
| Thread | ||
|
run():void
このメソッドをオーバーライドして、スレッドの処理を記述します.
| Thread | ||
| className | property |
className:String [read-only]このスレッドのクラス名を返します.
デフォルトでは、 getQualifiedClassName メソッドを使用してクラス名を取得します。
Implementation public function get className():String
| currentThread | property |
currentThread:Thread [read-only]現在実行中のスレッドを返します.
現在実行中のスレッドがない場合、 null を返します。
Implementation public static function get currentThread():Thread
| id | property |
id:uint [read-only]このスレッドのユニークな識別子を返します.
initialize メソッドが呼び出されない限り、ふたつのスレッドに同じ id が割り振られることはありません。
Implementation public function get id():uint
| isInterrupted | property |
isInterrupted:Boolean [read-only]このスレッドが割り込まれている場合は true、そうでない場合は false を返します.
このプロパティが true を返すようになるのは、待機状態でないスレッドに対して、 interrupt メソッドで割り込んだ場合です。
Implementation public function get isInterrupted():Boolean
See also
| isReady | property |
isReady:Boolean [read-only]initialize メソッドの呼び出しによって IThreadExecutor が設定され、スレッドが実行可能な状態であれば true、そうでなければ false を返します.
Implementation public static function get isReady():Boolean
See also
| name | property |
name:String [read-write]このスレッドの名前を設定します.
Implementation public function get name():String
public function set name(value:String):void
| state | property |
state:uint [read-only]このスレッドの状態を返します.
返される値は、 ThreadState クラスで定義されている定数のいずれかになります。
Implementation public function get state():uint
See also
| uncaughtErrorHandler | property |
uncaughtErrorHandler:Function [read-write]どのスレッドにも捕捉されなかった例外のためのハンドラを設定します.
スレッド内で例外が発生し、処理されないままトップレベルまで到達するとこのハンドラが呼び出されます。
ここに登録する関数は、第一引数に発生した例外である Object と、第二引数に発生元のスレッドである Thread を引数としてとる必要があります。
Implementation public static function get uncaughtErrorHandler():Function
public function set uncaughtErrorHandler(value:Function):void
| Thread | () | constructor |
public function Thread()新しい Thread クラスのインスタンスを生成します.
| checkInterrupted | () | method |
public static function checkInterrupted():Boolean現在のスレッドが割り込まれているかどうかを調べます.
このメソッドによりスレッドの「割り込みステータス」がクリアされます。 つまり、このメソッドが続けて2回呼び出された場合、2回目の呼び出しは false を返します。
ReturnsBoolean — 現在のスレッドが割り込まれている場合は true、そうでない場合は false
|
| error | () | method |
public static function error(klass:Class, func:Function, reset:Boolean = true):void現在実行中のスレッドおよびその子スレッドで例外が発生した場合に実行する実行関数を設定します.
ここで設定される実行関数は、発生した例外である Object と、例外が発生したスレッドである Thread のふたつの引数をとる関数である必要があります。
この関数によって例外を処理できた (この関数内で再び例外が発生しなかった) 場合で、この関数内で next メソッドによる実行関数の設定が行われなかった場合、例外が発生する前の実行関数の設定を復元します。
この設定は、reset 引数が false に設定されない限り、スレッドの実行のたびにリセットされます。
Parametersklass:Class — どの型の例外が発生した場合に関数を実行するかを示すクラス
|
|
func:Function — 例外が発生した際に実行される実行関数
|
|
reset:Boolean (default = true) — 次の実行のタイミングでこの設定を削除する場合には true、そうでなければ false
|
| event | () | method |
public static function event(dispatcher:IEventDispatcher, type:String, func:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void現在実行中のスレッドが指定されたイベントが発生した場合に実行する実行関数を設定します.
ここで設定される実行関数は、発生したイベントである Event を引数にとる関数である必要があります。
このメソッドによってイベントハンドラが設定される場合、スレッドは自動的にイベントが発生するまで待機状態となります。 ただし、 next メソッドによって次に実行する実行関数が設定される場合、待機状態にはならず、実行が継続されます。
この設定は、スレッドの実行のたびにリセットされます。
Parametersdispatcher:IEventDispatcher — イベントリスナーの登録先となるディスパッチャ
|
|
type:String — 捕捉するイベント名
|
|
func:Function — イベントが発生した場合に実行する実行関数
|
|
useCapture:Boolean (default = false) — flash.events.IEventDispatcher#addEventListener() の該当する引数を参照してください。
|
|
priority:int (default = 0) — flash.events.IEventDispatcher#addEventListener() の該当する引数を参照してください。
|
|
useWeakReference:Boolean (default = false) — flash.events.IEventDispatcher#addEventListener() の該当する引数を参照してください。
|
See also
| executeAllThreads | () | method |
public static function executeAllThreads():void全てのスレッドを実行します.
通常、このメソッドは IThreadExector インターフェイスの実装クラスによって呼び出されます。
| finalize | () | method |
protected function finalize():voidこのメソッドをオーバーライドして、スレッドの終了処理を記述します.
スレッドが終了フェーズに移行すると、必ずこのメソッドが実行関数に設定され、スレッドが実行されます。 例外が発生したりした場合でも、必ず終了フェーズに移行するので、スレッドが終了する前にはこのメソッドが実行されることが 確実に保証されています。
このメソッドも実行関数と同じ扱いであるため、 next をはじめとするメソッドによってスレッドを制御することが可能です。
スレッドはこのメソッドを利用して終了処理を行い、いかなる状況でも安全に終了することを保証するべきです。
| formatName | () | method |
protected function formatName(name:String):Stringこのスレッドの名前を整形して返します.
デフォルトでは、
'[' + className + ' ' + name + ']'
と等価な値が返されます。
このメソッドの呼び出し結果は、 toString メソッドなどで使用されます。
Parametersname:String — スレッドの名前
|
String — 整形された名前
|
| initialize | () | method |
public static function initialize(executor:IThreadExecutor):voidスレッドライブラリを初期化します.
このメソッドは、最初に一度だけ呼び出してください。
スレッドの実行は、指定された IThreadExecutor インスタンスによって行われます。 (このメソッド内で、 IThreadExectuor#start が呼び出されます)
Parametersexecutor:IThreadExecutor — スレッドの実行を行う IThreadExecutor
|
See also
| interrupt | () | method |
public function interrupt():voidこのスレッドに割り込みます.
このスレッドが待機中である場合、割り込みステータスはクリアされ、スレッドが起床します。 このとき、割り込みハンドラが設定されていれば実行関数を割り込みハンドラに設定して実行を再開し、 そうでない場合は InterruptedError を発生させます。
待機中でない場合、このスレッドの割り込みステータスが設定されます。
| interrupted | () | method |
public static function interrupted(func:Function):void現在実行中のスレッドが待機中に割り込まれた場合に実行する実行関数を設定します.
このメソッドによって割り込みハンドラが設定されていない状態で、待機中に割り込みが発生すると、 例外 InterruptedError が発生します。
この設定はスレッドの実行のたびにリセットされます。
Parametersfunc:Function — 待機中に割り込まれた場合に実行する実行関数
|
| join | () | method |
public function join(timeout:uint = 0):Booleanこのスレッドが終了するまで、現在のスレッドを待機させます.
Parameterstimeout:uint (default = 0) — 待機させる時間 (ミリ秒)。 0 を指定した場合、永遠に待ち続けます
|
Boolean — 待機する必要がある場合は true、そうでない場合は false
|
| next | () | method |
public static function next(func:Function):void現在実行中のスレッドが次に実行する実行関数を設定します.
この設定は、スレッドの実行のたびにリセットされます。
このメソッドの呼び出しによって次に実行する実行関数が設定されない場合、スレッドは終了フェーズへと移行します。
Parametersfunc:Function — 次に実行する実行関数
|
| run | () | method |
protected function run():voidこのメソッドをオーバーライドして、スレッドの処理を記述します.
start メソッドが呼び出され、スレッドの実行が開始されると、まずはじめにこのメソッドが実行関数として設定され、 スレッドが実行されます。
このメソッド内で next メソッドを呼び出すことにより、次の実行関数を設定することができます。 次の実行関数が設定されない場合、スレッドは終了フェーズへと移行します。
next メソッドのほか、 wait, join, sleep, event, timeout, error, interrupted といった メソッドを呼び出すことで、スレッドの動作を様々に制御することができます。
See also
| sleep | () | method |
public static function sleep(time:uint):void現在実行中のスレッドの実行を、指定された時間だけ中断させます.
指定された時間が経過すると、 sleep メソッドが呼び出されなかった場合と同様に実行が再開されます。
スレッドの実行が中断しても、子スレッドの実行が中断されることはありません。
Parameterstime:uint — 実行を中断させる時間 (ミリ秒)
|
| start | () | method |
public function start():voidスレッドを開始します.
スレッドが既に開始されている場合 (state が NEW でない場合) は IllegalThreadStateError が スローされます。
スレッドライブラリが初期化されていない状態の場合 (isReady が false の場合) は ThreadLibraryNotInitializedError が スローされます。
あるスレッドの実行中にこのメソッドが呼び出された場合、そのスレッドはこのメソッドが呼び出されたスレッドの親スレッドとなり、 このメソッドが呼び出されたスレッドは子スレッドとなります。
スレッドが実行中で無い場合にこのメソッドが呼び出された場合、このメソッドが呼び出されたスレッドはトップレベルスレッドとなります。
このメソッドが呼び出されると、実行関数はまず run メソッドに設定されます。
IllegalThreadStateError — スレッドが既に開始されている場合
|
|
ThreadLibraryNotInitializedError — スレッドライブラリが初期化されていない場合
|
| timeout | () | method |
public static function timeout(func:Function):void現在実行中のスレッドが待機中にタイムアウトした場合に実行する実行関数を設定します.
この設定は、スレッドの実行のたびにリセットされます。
Parametersfunc:Function — タイムアウトした場合に実行する実行関数
|
| toString | () | method |
public function toString():Stringこのスレッドの文字列表現を返します.
デフォルトでは、 formatName メソッドを、このスレッドの名前を引数にして呼び出した結果です。
ReturnsString — このスレッドの文字列表現
|