Thread
Threadクラスは Objectクラスの直接のサブ・クラスで、
Runnableをインプリメントしています。
java.langパッケージに含まれます。
Threadはスレッドとのインターフェイスを提供するクラスです。
スレッドをコントロールするメソッドを提供します。
Threadクラスのフィールド
Threadクラスには、スレッドの優先順位を表す定数が publicなフィールドとして
定義されています。
- public final static int MIN_PRIORITY
- public final static int NORM_PRIORITY
- public final static int MAX_PRIORITY
スレッドの優先度は MIN_PRIORTY(=1)から MAX_PRIORITY(=10) までの
数値で表されます。
特に指定しない場合のデフォルト値は NORM_PRIORITY(=5)が用いられます。
Threadクラスのメソッド
Threadクラスには、
引数の区別もすると 7個のコンストラクタと 30個余りのメソッドが定義されています。
メソッドの目的ごとに以下の項目のようにグループ分けして解説します。
- コンストラクタ
- スレッドの処理をコントロールするためのメソッド
- スレッドの状態をコントロールするためのメソッド
- システムによるスレッドの操作に関連するメソッド
- カレント・スレッドのコントロールを行う staticなメソッド
- スレッドのスケジュールを調べる staticなメソッド
- Threadのオブジェクト自身の情報を与えるメソッド
- その他のメソッド
コンストラクタ
- public Thread()
- public Thread(Runnable target)
- public Thread(ThreadGroup group, Runnable target)
- public Thread(String name)
- public Thread(ThreadGroup group, String name)
- public Thread(Runnable target, String name)
- public Thread(ThreadGroup group, Runnable target, String name)
コンストラクタに与えることができる引数は3種類あります。
それらの組み合わせで7種類の指定が可能です。
target は run()メソッドの実装を持つオブジェクトです。
run()メソッドの内容がスレッドの処理となります。
group は ThreadGroup のオブジェクトです。
Threadのオブジェクトをグループに所属させたい時に指定します。
name は Threadのオブジェクトに固有の名前を付けたい時に指定します。
スレッドの処理をコントロールするためのメソッド
- public synchronized void start()
- public void run()
- public final void stop()
- public final synchronized void stop(Throwable o)
- public final void suspend()
- public final void resume()
- public final synchronized void join(long millis) throws InterruptedException
- public final synchronized void join(long millis, int nanos) throws InterruptedException
- public final void join() throws InterruptedException
start()メソッドは、オブジェクトに結びつけられた Runnableのオブジェクトに
実装された run()メソッドを呼び出し、スレッドの処理を開始します。
Threadのオブジェクト自身を Runnableのオブジェクトとした場合には、
run()メソッドに処理の内容を定義します。
stop()メソッドはスレッドの処理を停止させます。
suspend()メソッドは resume()メソッドが呼ばれるまで、
一時的にスレッドの処理を中断します。
join()メソッドは実行されているスレッドの処理が終わるのを、
引数に指定したタイムアウトの時間だけ待ち続けます。
第1引数はミリ秒単位の時間です。
さらに短い時間間隔を指定したい場合は、第2引数にナノ秒単位の時間を
指定することもできます。
(ただし現時点のマシンの能力では、指定してもほとんど無意味でしょう。)
引数を与えないと終了するまで永久に待ち続けます。
スレッドの状態をコントロールするためのメソッド
- public final boolean isAlive()
- public final void setPriority(int newPriority)
- public final int getPriority()
- public final ThreadGroup getThreadGroup()
- public void interrupt()
- public boolean isInterrupted()
isAlive()はスレッドの処理が活動中であるかをチェックします。
start()メソッドが呼ばれてから、
stop()メソッドが呼ばれるまで isAlive()の値は trueです。
setPriority()およびgetPriority()は、スレッドの優先度の
設定および取得を行います。
getThreadGroup()メソッドは、スレッドが所属する ThreadGroup()を返します。
interrupt()はスレッドの処理に割り込みを行います。
isInterrupted()はスレッドに割り込みがかかったかどうかを判定します。
システムによるスレッドの操作に関連するメソッド
- public int countStackFrames()
- public final boolean isDaemon()
- public final void setDaemon(boolean on)
- public void checkAccess()
countStackFrames()メソッドは、Threadのオブジェクトが現在スタック上に
何個のフレームを持っているかを返します。
isDaemon()メソッドは、Threadのオブジェクトがシステムのものか
ユーザーのものかを識別します。システムのものなら trueが返ります。
setDaemon()メソッドは、Threadの所属を設定します。trueならば
Threadのオブジェクトはシステムのものとなり、false ならユーザーの
ものとなります。全ての Threadのオブジェクトがシステムのものになった
時点で、プログラムの実行が終了したと判断されます。
checkAccess()メソッドは、カレント・スレッドが Threadのオブジェクトに
対するアクセス権限があるかどうかをセキュリティ・マネジャに問い合わせます。
アクセス権限がない場合は Exceptionを発生します。
カレント・スレッドのコントロールを行う staticなメソッド
- public static Thread currentThread()
- public static void yield()
- public static void sleep(long millis) throws InterruptedException
- public static void sleep(long millis, int nanos) throws InterruptedException
- public static void dumpStack()
- public static boolean interrupted()
カレント・スレッドとは、その瞬間に実行中のスレッドのことです。
(カレント・スレッドは常に1個しか存在しません。)
Threadクラスにはカレント・スレッドをコントロールするための
メソッドも提供されています。
これらは staticなメソッドで、
すべてのスレッドのオブジェクトによって共通して利用されます。
currentThread()メソッドは、
現在のカレント・スレッドのオブジェクトを返します。
yield()メソッドは現在のカレント・スレッドの処理を中断し、次のスレッド
の処理に移ります。
sleep()メソッドはカレント・スレッドの処理を、
指定された時間だけ休ませます。第1引数はミリ秒単位で指定する休憩時間です。
さらに短い時間間隔を指定したい場合は、第2引数にナノ秒単位の時間を
指定することもできます。
(ただし現時点のマシンの能力では、指定してもほとんど無意味です。)
sleep()メソッドは次のように使用することになります。
try{
Thread.sleep( 1000 ); // 現在の処理を1秒間中断
}
catch(InterruptedException e)
{
// エラー処理
}
dumpStack()はデバッグ用のメソッドで、カレント・スレッドのスタックの状況を
出力します。
isInterrupted()はカレント・スレッドが割り込みを受けたかどうかを判定します。
スレッドのスケジュールを調べる staticなメソッド
- public static int activeCount()
- public static int enumerate(Thread tarray[])
他のスレッドの状況を知るためのメソッドも、
staticなメソッドとして提供されています。
activeCount()メソッドは、スレッド・グループ内のアクティブな
スレッドの数を返します。
enumerate()メソッドは、スレッド・グループ内の全てのアクティブな
Threadの状態のコピーを、引数に与えた配列に格納します。
Threadのオブジェクト自身の情報を与えるメソッド
- public final void setName(String name)
- public final String getName()
- public String toString()
setName()およびgetName()メソッドは、スレッドの名前の設定および取得を
行います。toString()メソッドは、スレッドの名前、優先度、グループに
関する情報を Stringクラスのオブジェクトとして返します。
その他のメソッド
ドキュメントには上記のメソッドは JDK1.0.2では機能を提供しないと書かれています。
ソースを見る限りでは、JDK 1.1.1でも、
依然としてこのメソッドの機能は提供されていないようです。