Revised: Mar./23rd/2002
スレッドは、 Runnable
インタフェースの実装クラス型オブジェクトとして作成します。これをスレッドとして実行する場合は、 run()
メソッドを実装して、 Thread
クラスにコンストラクタ引数として受け渡すか、そもそも Thread
クラスの継承として作成します。「この Runnable なオブジェクトをスレッドとして実行してくれ」と言って Thread
クラス型オブジェクトに委譲するか、自分自身スレッドとして実行可能にしておくかの違いです。
Thread
クラスはスレッドを操作するための基本的なメソッドを沢山実装しています。本節では、それらのメソッドを用いて、スレッドを操作する方法を紹介します。
前節では、スレッドが、作成/実行可能/実行中/死の状態を遷移することを見てきました。
Thread
クラスをインスタンス化することでスレッドが作成され、このオブジェクトの start()
メソッドが呼ばれて実行可能になり、適時に run()
メソッドが実行され、終了してこのスレッドを開始したスレッドへ制御が戻ってきます。
本節では、 Thread
クラスのメソッドを用いて、ライフサイクルを明示的に操作してみます。
sleep()
...一定時間のスレッドのスリープyield()
...一時的な実行権の放棄getPriority()
/setPriority()
...優先度の設定/取得これらのメソッドは、スレッドをある程度明示的に操作して、状態を遷移させます。しかし、他のスレッドとの協調的な動作ではなく、あくまでも単体のスレッド自身が動作に責任を負う形になります。
これに対して、他のスレッドの作業の終了などのシグナルを受け取ってスレッドの状態を操作することが可能です。このように、他のスレッドと協調することを同期 (synchronous) 、上で紹介したメソッドのように協調しないことを非同期 (asynchronous) と呼びます。
マルチスレッドプログラミングで、データを共有する場合などは、スレッド間で同期をとる必要があります。
本稿では、非同期のスレッドの説明に続いて、スレッドの同期に関する事項の説明をする。