|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.lang.Thread
public class Thread
「スレッド」とは、プログラム内での実行スレッドのことです。Java 仮想マシンでは、アプリケーションは並列に実行される複数のスレッドを使用することができます。
各スレッドには優先順位が付けられています。優先順位の高いスレッドは、優先順位の低いスレッドよりも優先して実行されます。さらに、各スレッドがデーモンとしてマークされている場合もあれば、されていない場合もあります。あるスレッドで実行中のコードが新しい Thread
オブジェクトを作成すると、この新しいスレッドには、その時点では、作成側のスレッドの優先順位に等しい優先順位が設定され、作成側スレッドがデーモンである場合にだけ、デーモンスレッドになます。
通常、Java 仮想マシンが起動する (一般的にはある指定されたクラスの main
という名前が付けられたメソッドを呼び出す) と、デーモンスレッドではないスレッドが 1 つ存在します。Java 仮想マシンは、以下のどれかの条件が発生するまでスレッドを実行し続けます。
Runtime
クラスの exit
メソッドが呼び出され、セキュリティーマネージャーが exit 動作を許可した場合
run
メソッドの呼び出しから復帰することによって、または run
メソッド以外から送られる例外をスローすることによって、デーモンスレッドではないすべてのスレッドが終了した場合
新しい実行のスレッドを作成するには 2 通りの方法があります。1 つの方法は、クラスを Thread
のサブクラスであると宣言することです。このサブクラスは、Thread
クラスの run
メソッドをオーバーライドしなければなりません。そうすればサブクラスのインスタンスは割り当てられ、起動されることができます。たとえば、初期値より大きい素数を計算するスレッドは、次に示すようにして作成できます。
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
次に、次に示すコードでスレッドを作成し、スレッドの実行を開始します。
PrimeThread p = new PrimeThread(143); p.start();
スレッドを作成するもう 1 つの方法は、Runnable
インタフェースを実装するクラスを宣言することです。そうすると、そのクラスは、run
メソッドを実装します。クラスのインスタンスが割り当てられ、Thread
の作成時に引数として渡され、開始されます。この方法での同じ例は、次に示すようになります。
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
次に、次に示すコードでスレッドを作成し、スレッドの実行を開始します。
PrimeRun p = new PrimeRun(143); new Thread(p).start();
各スレッドは識別のための名前を持ちます。複数のスレッドが同じ名前を持つことがあります。スレッドの作成時に名前が指定されないと、スレッドには新しい名前が生成されます。
Runnable
,
Runtime.exit(int)
,
run()
,
stop()
入れ子のクラスの概要 | |
---|---|
static class |
Thread.State
スレッドの状態です。 |
static interface |
Thread.UncaughtExceptionHandler
キャッチされない例外により、Thread が突然終了したときに呼び出されるのハンドラのインタフェースです。 |
フィールドの概要 | |
---|---|
static int |
MAX_PRIORITY
スレッドに設定できる最高優先順位です。 |
static int |
MIN_PRIORITY
スレッドに設定できる最低優先順位です。 |
static int |
NORM_PRIORITY
スレッドに割り当てられるデフォルトの優先順位です。 |
コンストラクタの概要 | |
---|---|
Thread()
新しい Thread オブジェクトを割り当てます。 |
|
Thread(Runnable target)
新しい Thread オブジェクトを割り当てます。 |
|
Thread(Runnable target,
String name)
新しい Thread オブジェクトを割り当てます。 |
|
Thread(String name)
新しい Thread オブジェクトを割り当てます。 |
|
Thread(ThreadGroup group,
Runnable target)
新しい Thread オブジェクトを割り当てます。 |
|
Thread(ThreadGroup group,
Runnable target,
String name)
その実行オブジェクトとして target 、名前として指定された name を持つ、group によって参照されるスレッドグループに属するような、新しい Thread オブジェクトを割り当てます。 |
|
Thread(ThreadGroup group,
Runnable target,
String name,
long stackSize)
新しい Thread オブジェクトを割り当て、実行オブジェクトとして target を保持し、指定された name を名前として保持するようにします。 |
|
Thread(ThreadGroup group,
String name)
新しい Thread オブジェクトを割り当てます。 |
メソッドの概要 | |
---|---|
static int |
activeCount()
現行スレッドのスレッドグループ内のアクティブなスレッド数を返します。 |
void |
checkAccess()
現在実行中のスレッドが、このスレッドを変更するためのアクセス権を持っているかどうかを判定します。 |
int |
countStackFrames()
推奨されていません。 この呼び出しの定義は、推奨されていない suspend() に依存します。
また、この呼び出しの結果は保証されません。 |
static Thread |
currentThread()
現在実行中のスレッドオブジェクトの参照を返します。 |
void |
destroy()
推奨されていません。 このメソッドはもともとクリーンアップなしで破棄されるように設計されていました。 保持されるモニターはロックされた状態を維持します。 ただし、このメソッドは実装されませんでした。 実装されていたら、 suspend() とほぼ同じようにデッドロックが発生します。
ターゲットスレッドが重要なシステムリソースを保護するロックを保持した状態で破棄された場合、どのスレッドも再びこのリソースにアクセスできません。
別のスレッドがこのリソースをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由 |
static void |
dumpStack()
現在のスレッドのスタックトレースを標準エラーストリームに出力します。 |
static int |
enumerate(Thread[] tarray)
現行スレッドのスレッドグループおよびその下位グループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。 |
static Map<Thread,StackTraceElement[]> |
getAllStackTraces()
すべてのライブスレッドのスタックトレースマップを返します。 |
ClassLoader |
getContextClassLoader()
この Thread のコンテキスト ClassLoader を返します。 |
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler()
キャッチされない例外によりスレッドが突然終了したときに呼び出されるデフォルトのハンドラを返します。 |
long |
getId()
このスレッドの識別子を返します。 |
String |
getName()
このスレッドの名前を返します。 |
int |
getPriority()
このスレッドの優先順位を返します。 |
StackTraceElement[] |
getStackTrace()
このスレッドのスタックダンプを表すスタックトレース要素の配列を返します。 |
Thread.State |
getState()
このスレッドの状態を返します。 |
ThreadGroup |
getThreadGroup()
このスレッドが所属するスレッドグループを返します。 |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler()
キャッチされない例外によりスレッドが突然終了したときに呼び出されるハンドラを返します。 |
static boolean |
holdsLock(Object obj)
現行スレッドが指定されたオブジェクトに対するモニターロックを保持する場合にのみ、true を返します。 |
void |
interrupt()
このスレッドに割り込みます。 |
static boolean |
interrupted()
現在のスレッドが割り込まれているかどうかを調べします。 |
boolean |
isAlive()
このスレッドが生存しているかどうかを判定します。 |
boolean |
isDaemon()
このスレッドがデーモンスレッドであるかどうかを判定します。 |
boolean |
isInterrupted()
このスレッドが割り込まれているどうかを調べます。 |
void |
join()
このスレッドが終了するのを待機します。 |
void |
join(long millis)
このスレッドが終了するのを、最高で millis ミリ秒待機します。 |
void |
join(long millis,
int nanos)
最高で millis ミリ秒に nanos ナノ秒を加算した間、このスレッドが終了するのを待機します。 |
void |
resume()
推奨されていません。 このメソッドはデッドロックを発生しやすいため推奨されません。 suspend() とともに使用するためだけに提供されています。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由 |
void |
run()
このスレッドが別個の Runnable 実行オブジェクトを使用して作成された場合、その Runnable オブジェクトの run メソッドが呼び出されます。 |
void |
setContextClassLoader(ClassLoader cl)
この Thread のコンテキスト ClassLoader を設定します。 |
void |
setDaemon(boolean on)
このスレッドを、デーモンスレッドまたはユーザースレッドとしてマークします。 |
static void |
setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
キャッチされない例外により、スレッドが突然終了したときや、このスレッドに対してほかにハンドラが定義されていないときに呼び出されるデフォルトのハンドラを設定します。 |
void |
setName(String name)
このスレッドの名前を引数 name に等しくなるように変更します。 |
void |
setPriority(int newPriority)
このスレッドの優先順位を変更します。 |
void |
setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
キャッチされない例外により、突然スレッドが終了したときに使用されるハンドラを設定します。 |
static void |
sleep(long millis)
システムタイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数の間、スリープ (一時的に実行を停止) させます。 |
static void |
sleep(long millis,
int nanos)
システムタイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数に指定されたナノ秒数を加算した間、スリープ (実行を停止) させます。 |
void |
start()
このスレッドの実行を開始します。 |
void |
stop()
推奨されていません。 このメソッドは本質的に安全ではありません。Thread.stop を使ってスレッドを停止すると、チェックされていない ThreadDeath 例外がスタックの下から上に伝えられた結果、そのスレッドによりロックされていたモニターのロックがすべて解除されます。これらのモニターによって直前まで保護されていたオブジェクトが整合性のない状態にあった場合、壊れたオブジェクトはほかのスレッドに対して可視になり、動作が保証されないことがあります。多くの場合、ターゲットスレッドの実行停止を指示するには、stop ではなく、単に一部の変数を変更するコードを使用する必要があります。ターゲットスレッドは、この変数を定期的に検査し、実行を停止するべきことを変数が示している場合には、スレッドの run メソッドから通常の方法で復帰する必要があります。条件変数などでターゲットスレッドが長い間待機している場合、待機を中断させるには、interrupt メソッドを使用します。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由 |
void |
stop(Throwable obj)
推奨されていません。 このメソッドは本質的に安全ではありません。 stop() を参照してください。
さらに、このメソッドは、ターゲットスレッドで処理の準備ができていない例外の生成に使用されることがある点でも危険です (このメソッドがなければスレッドによりスローされることのない、チェックされた例外など)。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由 |
void |
suspend()
推奨されていません。 このメソッドはデッドロックを発生しやすいため推奨されません。 ターゲットスレッドが、中断される時点で、重要なシステムリソースを保護するモニターをロックしている場合、ターゲットスレッドが再開されるまでどのスレッドもそのリソースにアクセスできません。このとき、ターゲットスレッドを再開するスレッドが、 resume を呼び出す前にこのモニターをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由 |
String |
toString()
スレッドの名前、優先順位、スレッドグループを含むこのスレッドの文字列表現を返します。 |
static void |
yield()
現在実行中のスレッドオブジェクトを一時的に休止させ、ほかのスレッドが実行できるようにします。 |
クラス java.lang.Object から継承されたメソッド |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
フィールドの詳細 |
---|
public static final int MIN_PRIORITY
public static final int NORM_PRIORITY
public static final int MAX_PRIORITY
コンストラクタの詳細 |
---|
public Thread()
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread(null, null,
gname)
と同じ効果を持ちます。 この場合、gname は、新しく作成される名前です。自動的に作成される名前は、n を整数とすると "Thread-"+
n の形式を取ります。
Thread(ThreadGroup, Runnable, String)
public Thread(Runnable target)
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread(null, target,
gname)
と同じ効果を持ちます。 この場合、gname は、新しく作成される名前です。自動的に作成される名前は、n を整数とすると "Thread-"+
n の形式を取ります。
target
- その run
メソッドが呼び出されるオブジェクトThread(ThreadGroup, Runnable, String)
public Thread(ThreadGroup group, Runnable target)
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread(group, target,
gname)
と同じ効果を持ちます。 この場合、gname は、新しく作成される名前です。自動的に作成される名前は、n を整数とすると "Thread-"+
n の形式を取ります。
group
- スレッドグループtarget
- その run
メソッドが呼び出されるオブジェクト
SecurityException
- 現在のスレッドが、指定されたスレッドグループ内のスレッドを作成できない場合Thread(ThreadGroup, Runnable, String)
public Thread(String name)
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread(null, null, name)
と同じ効果を持ちます。
name
- 新しいスレッドの名前Thread(ThreadGroup, Runnable, String)
public Thread(ThreadGroup group, String name)
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread(group, null, name)
と同じ効果を持ちます。
group
- スレッドグループname
- 新しいスレッドの名前
SecurityException
- 現在のスレッドが、指定されたスレッドグループ内のスレッドを作成できない場合Thread(ThreadGroup, Runnable, String)
public Thread(Runnable target, String name)
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread(null, target, name)
と同じ効果を持ちます。
target
- その run
メソッドが呼び出されるオブジェクトname
- 新しいスレッドの名前Thread(ThreadGroup, Runnable, String)
public Thread(ThreadGroup group, Runnable target, String name)
target
、名前として指定された name
を持つ、group
によって参照されるスレッドグループに属するような、新しい Thread
オブジェクトを割り当てます。
group
が null
で、セキュリティーマネージャーが存在する場合、グループはセキュリティーマネージャーの getThreadGroup
メソッドにより決まります。group
が null
でセキュリティーマネージャーが存在しない場合、またはセキュリティーマネージャーの getThreadGroup
メソッドが null
を返す場合、グループは新規スレッドを作成中のスレッドと同じ ThreadGroup に設定されます。
セキュリティーマネージャーが存在する場合は、ThreadGroup を引数として渡して checkAccess
メソッドを呼び出します。
また、getContextClassLoader
メソッドまたは setContextClassLoader
メソッドをオーバーライドするサブクラスのコンストラクタによって直接的または間接的に呼び出されたとき、RuntimePermission("enableContextClassLoaderOverride")
アクセス権を使用して checkPermission
メソッドを呼び出します。その結果、SecurityException が発生することがあります。
target
引数が null
ではない場合、このスレッドが起動されると target
の run
メソッドが呼び出されます。target 引数が null
である場合は、このスレッドが起動されるときにこのスレッドの run
メソッドが呼び出されます。
新しく作成されたスレッドの優先順位は、そのスレッドを作成したスレッド、つまり現在実行中のスレッドの優先順位と同じに設定されます。この優先順位を新しい値に変更する場合は、setPriority
メソッドを使用できます。
新しく作成されたスレッドは、それを作成するスレッドがデーモンスレッドとマークされている場合にだけ、デーモンスレッドとマークされます。スレッドがデーモンであるかどうかを変更する場合は、setDaemon
メソッドを使用できます。
group
- スレッドグループtarget
- その run
メソッドが呼び出されるオブジェクトname
- 新しいスレッドの名前
SecurityException
- 現在のスレッドが、指定されたスレッドグループ内にスレッドを作成できない、またはコンテキストクラスローダーのメソッドをオーバーライドできない場合Runnable.run()
,
run()
,
setDaemon(boolean)
,
setPriority(int)
,
ThreadGroup.checkAccess()
,
SecurityManager.checkAccess(java.lang.Thread)
public Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Thread
オブジェクトを割り当て、実行オブジェクトとして target
を保持し、指定された name
を名前として保持するようにします。また、group
によって参照されるスレッドグループに所属し、指定された「スタックサイズ」を保持します。
このコンストラクタは、スレッドのスタックサイズ指定が可能である点を除き、Thread(ThreadGroup,Runnable,String)
と同じです。スタックサイズは、仮想マシンをこのスレッドのスタックに割り当てるアドレス空間のおよそのバイト数になります。stackSize パラメータが存在する場合、その効果はプラットフォームによって大きく異なります。
いくつかのプラットフォームでは、stackSize パラメータにより大きな値を指定することで、スレッドが StackOverflowError
をスローする前により大きな回帰深度を達成することが可能になります。同様に、より小さな値を指定することで、より多くのスレッドが OutOfMemoryError
(またはほかの内部エラー) をスローせずに、並行して存在することが可能になります。stackSize パラメータの値と、最大回帰深度や並行レベルとの関係はプラットフォームによって異なります。プラットフォームによっては、stackSize パラメータの値がなんら影響を与えない場合があります。
仮想マシンは、stackSize パラメータを自由に扱い、指示することができます。プラットフォームでは指定された値が小さすぎる場合、仮想マシンは代わりにプラットフォーム固有の最小値を使用できます。 指定された値が大きすぎる場合には、仮想マシンは代わりにプラットフォーム固有の最大値を使用できます。同様に、仮想マシンは、適切な場合には指定された値の切り上げまたは切り下げを自由に実行 (または完全に無視) できます。
stackSize パラメータに値ゼロを指定すると、このコンストラクタは Thread(ThreadGroup, Runnable, String) コンストラクタと正確に同じ動作を実行します。
このコンストラクタの動作はプラットフォームによって異なるために、慎重に使用する必要があります。指定された計算の実行に必要なスレッドスタックサイズは、JRE 実装によって異なる可能性があります。このため、スタックサイズパラメータを注意深くチューニングしたり、アプリケーションを実行する JRE 実装ごとにチューニングを繰り返したりすることが必要な場合があります。
実装上の注意:Java プラットフォーム実装者は、stackSize parameter を基準にして実装の動作をドキュメント化しておくことをお勧めします。
group
- スレッドグループtarget
- その run
メソッドが呼び出されるオブジェクトname
- 新しいスレッドの名前stackSize
- 新規スレッドのスタックサイズまたはゼロ (このパラメータを無視することを示す)
SecurityException
- 現在のスレッドが、指定されたスレッドグループ内のスレッドを作成できない場合メソッドの詳細 |
---|
public static Thread currentThread()
public static void yield()
public static void sleep(long millis) throws InterruptedException
millis
- ミリ秒単位のスリープ時間の長さ
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。
この例外がスローされると、現在のスレッドの「割り込みステータス」はクリアされるObject.notify()
public static void sleep(long millis, int nanos) throws InterruptedException
millis
- ミリ秒単位のスリープ時間の長さnanos
- スリープするための 0 〜 999999 の追加ナノ秒
IllegalArgumentException
- millis の値が負数の場合、または nanos の値が 0 〜 999999 の範囲外の場合
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。
この例外がスローされると、現在のスレッドの「割り込みステータス」はクリアされるObject.notify()
public void start()
run
メソッドを呼び出します。
その結果、(start
メソッドへの呼び出しから復帰する) 現在のスレッドと (その run
メソッドを実行する) 別のスレッドという 2 つのスレッドが並列に実行されます。
スレッドを複数回起動するのは、決して正しいとは言えません。特に、スレッドは実行を終えてから再起動することはできません。
IllegalThreadStateException
- スレッドがすでに起動していた場合run()
,
stop()
public void run()
Runnable
実行オブジェクトを使用して作成された場合、その Runnable
オブジェクトの run
メソッドが呼び出されます。そうでない場合、このメソッドは何も行わずに復帰します。
Thread
のサブクラスは、このメソッドをオーバーライドしなければなりません。
Runnable
内の run
start()
,
stop()
,
Thread(ThreadGroup, Runnable, String)
@Deprecated public final void stop()
ThreadDeath
例外がスタックの下から上に伝えられた結果、そのスレッドによりロックされていたモニターのロックがすべて解除されます。これらのモニターによって直前まで保護されていたオブジェクトが整合性のない状態にあった場合、壊れたオブジェクトはほかのスレッドに対して可視になり、動作が保証されないことがあります。多くの場合、ターゲットスレッドの実行停止を指示するには、stop
ではなく、単に一部の変数を変更するコードを使用する必要があります。ターゲットスレッドは、この変数を定期的に検査し、実行を停止するべきことを変数が示している場合には、スレッドの run メソッドから通常の方法で復帰する必要があります。条件変数などでターゲットスレッドが長い間待機している場合、待機を中断させるには、interrupt
メソッドを使用します。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由
セキュリティーマネージャーがインストールされている場合、this
を引数として、セキュリティーマネージャーの checkAccess
メソッドが呼び出されます。この結果、現在のスレッドで SecurityException
がスローされることがあります。
また、このスレッドが現在のスレッドと異なる場合、つまり、現在のスレッドが自分以外のスレッドを停止しようとしている場合は、RuntimePermission("stopThread")
を引数として、セキュリティーマネージャーの checkPermission
メソッドも呼び出されます。この場合にも、現在のスレッドで SecurityException
がスローされることがあります。
このスレッドによって表されるスレッドは、それが実行していた動作に関係なく強制的に異常停止させられ、新しく生成した ThreadDeath
オブジェクトを例外としてスローします。
まだ起動されていないスレッドを停止することができます。スレッドが最終的に起動されると、すぐに終了します。
アプリケーションは、通常とは異なるクリーンアップ動作を実行しなければならない場合を除き、ThreadDeath
をキャッチすべきではありません。 ただし、ThreadDeath
をスローすると、スレッドが正式に終了する前に try
文の finally
節が実行されることに注意してください。catch
節が ThreadDeath
オブジェクトをキャッチする場合は、スレッドが実際に終了するようにオブジェクトをスローし直すことが重要です。
そうでない場合、キャッチされていない例外を扱う最高レベルのエラーハンドラは、キャッチされていない例外が ThreadDeath
のインスタンスであれば、メッセージを出力したり、アプリケーションに通知したりすることはしません。
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合interrupt()
,
checkAccess()
,
run()
,
start()
,
ThreadDeath
,
ThreadGroup.uncaughtException(Thread,Throwable)
,
SecurityManager.checkAccess(Thread)
,
SecurityManager.checkPermission(java.security.Permission)
@Deprecated public final void stop(Throwable obj)
stop()
を参照してください。
さらに、このメソッドは、ターゲットスレッドで処理の準備ができていない例外の生成に使用されることがある点でも危険です (このメソッドがなければスレッドによりスローされることのない、チェックされた例外など)。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由
セキュリティーマネージャーがインストールされている場合、セキュリティーマネージャーの checkAccess
メソッドが呼び出されます。この結果、現在のスレッドで SecurityException
がスローされることがあります。
また、このスレッドが現在のスレッドと異なる場合、つまり、現在のスレッドが自分以外のスレッドを停止しようとしている場合、または obj
が ThreadDeath
のインスタンスでない場合は、RuntimePermission("stopThread")
を引数として、セキュリティーマネージャーの checkPermission
メソッドが呼び出されます。この場合にも、現在のスレッドで SecurityException
がスローされることがあります。
引数 obj
が null の場合、NullPointerException
が (現在のスレッド内で) スローされます。
このスレッドによって表されるスレッドは、それが実行する動作には関係なく強制的に終了され、例外として Throwable
オブジェクト obj
がスローされます。これは通常では行われない動作であるため、通常は引数を設定しない stop
メソッドを使用してください。
まだ起動されていないスレッドを停止することができます。スレッドが最終的に起動されると、すぐに終了します。
obj
- スロー対象の Throwable オブジェクト
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合
NullPointerException
- obj が null の場合interrupt()
,
checkAccess()
,
run()
,
start()
,
stop()
,
SecurityManager.checkAccess(Thread)
,
SecurityManager.checkPermission(java.security.Permission)
public void interrupt()
現在のスレッドが自身に割り込んでいないかぎり (この割り込みは許可される)、このスレッドの checkAccess
メソッドが呼び出されます。
このメソッドにより、SecurityException
がスローされる場合があります。 Object
クラスの wait()
、wait(long)
、または wait(long, int)
メソッドの呼び出し、またはこのクラスの join()
、join(long)
、join(long, int)
、sleep(long)
、または sleep(long, int)
メソッドの呼び出しでこのスレッドがブロックされる場合、割り込みステータスはクリアされ、InterruptedException
を受け取ります。
に対する I/O 操作でこのスレッドがブロックされる場合、チャネルは閉じられ、スレッドの割り込みステータスが設定されます。 また、スレッドは interruptible channel
ClosedByInterruptException
を受け取ります。
Selector
でこのスレッドがブロックされる場合、スレッドの割り込みステータスが設定されて、選択操作から即座に返されます。 通常、返される値は、セレクタの wakeup
メソッドが呼び出された場合と同じく、ゼロ以外の値になります。
前述の条件のどれにも当てはまらない場合、このスレッドの割り込みステータスが設定されます。
生存していないスレッドが割り込みを受けることが、効果を持つ必要がない場合
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合public static boolean interrupted()
スレッドが割り込みの時点で生存していなかったために無視されたスレッドでの割り込みは、このメソッドによって反映されて false を返します。
true
、そうでない場合は false
isInterrupted()
public boolean isInterrupted()
スレッドが割り込みの時点で生存していなかったために無視されたスレッドでの割り込みは、このメソッドによって反映されて false を返します。
true
、そうでない場合は false
interrupted()
@Deprecated public void destroy()
suspend()
とほぼ同じようにデッドロックが発生します。
ターゲットスレッドが重要なシステムリソースを保護するロックを保持した状態で破棄された場合、どのスレッドも再びこのリソースにアクセスできません。
別のスレッドがこのリソースをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由
NoSuchMethodError
をスローします。
NoSuchMethodError
- alwayspublic final boolean isAlive()
true
、そうでない場合は false
@Deprecated public final void suspend()
resume
を呼び出す前にこのモニターをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由
まず、このスレッドの checkAccess
メソッドが、引数なしで呼び出されます。この結果、現在のスレッドで SecurityException
がスローされることがあります。
スレッドは、生存している場合に中断され、再開されない処理を先に進めることはできません。
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合checkAccess()
@Deprecated public final void resume()
suspend()
とともに使用するためだけに提供されています。
詳細は、以下を参照してください。
Thread.stop、Thread.suspend、 Thread.resume、および Runtime.runFinalizersOnExit が推奨されない理由
まず、このスレッドの checkAccess
メソッドが、引数なしで呼び出されます。この結果、現在のスレッドで SecurityException
がスローされることがあります。
スレッドは、生存しているが中断されている場合、実行が再開されて処理を先に進めることが許可されます。
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合checkAccess()
,
suspend()
public final void setPriority(int newPriority)
まず、このスレッドの checkAccess
メソッドが、引数なしで呼び出されます。その結果、SecurityException
がスローされることがあります。
そうでない場合、このスレッドの優先順位は、指定された newPriority
とスレッドのスレッドグループの最高許容優先順位の内のどちらか小さい方に設定されます。
newPriority
- このスレッドを設定する優先順位
IllegalArgumentException
- 優先順位が MIN_PRIORITY
〜 MAX_PRIORITY
の範囲外である場合
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合getPriority()
,
checkAccess()
,
getThreadGroup()
,
MAX_PRIORITY
,
MIN_PRIORITY
,
ThreadGroup.getMaxPriority()
public final int getPriority()
setPriority(int)
public final void setName(String name)
name
に等しくなるように変更します。
まず、このスレッドの checkAccess
メソッドが、引数なしで呼び出されます。その結果、SecurityException
がスローされることがあります。
name
- このスレッドの新しい名前
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合getName()
,
checkAccess()
public final String getName()
setName(String)
public final ThreadGroup getThreadGroup()
public static int activeCount()
public static int enumerate(Thread[] tarray)
enumerate
メソッドを、配列引数を指定して呼び出すだけです。
セキュリティーマネージャーが存在する場合、enumerate
メソッドは、スレッドグループを引数としてセキュリティーマネージャーの checkAccess
メソッドを呼び出します。その結果、SecurityException
がスローされることがあります。
tarray
- Thread オブジェクトのコピー先配列
SecurityException
- セキュリティーマネージャーが存在し、セキュリティーマネージャーの checkAccess
メソッドがこの操作を許可しない場合ThreadGroup.enumerate(Thread[])
,
SecurityManager.checkAccess(ThreadGroup)
@Deprecated public int countStackFrames()
suspend()
に依存します。
また、この呼び出しの結果は保証されません。
IllegalThreadStateException
- このスレッドが中断されていない場合public final void join(long millis) throws InterruptedException
millis
ミリ秒待機します。
のタイムアウトは永遠に待機することを意味します。
millis
- ミリ秒単位の待機時間
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。
この例外がスローされると、現在のスレッドの「割り込みステータス」はクリアされるpublic final void join(long millis, int nanos) throws InterruptedException
millis
ミリ秒に nanos
ナノ秒を加算した間、このスレッドが終了するのを待機します。
millis
- ミリ秒単位の待機時間nanos
- 待機するための 0 〜 999999 の追加ナノ秒
IllegalArgumentException
- millis の値が負数の場合、または nanos の値が 0 〜 999999 の範囲外の場合
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。
この例外がスローされると、現在のスレッドの「割り込みステータス」はクリアされるpublic final void join() throws InterruptedException
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。
この例外がスローされると、現在のスレッドの「割り込みステータス」はクリアされるpublic static void dumpStack()
Throwable.printStackTrace()
public final void setDaemon(boolean on)
このメソッドは、スレッド起動前に呼び出す必要があります。
このメソッドは、引数なしでこのスレッドの checkAccess
メソッドを呼び出します。この結果、現在のスレッドで SecurityException
がスローされることがあります。
on
- true
の場合、このスレッドをデーモンスレッドとしてマークする
IllegalThreadStateException
- このスレッドがアクティブな場合
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合isDaemon()
,
checkAccess()
public final boolean isDaemon()
true
、そうでない場合は false
setDaemon(boolean)
public final void checkAccess()
セキュリティーマネージャーが存在する場合、このスレッドがその引数に指定されて checkAccess
メソッドが呼び出されます。その結果、SecurityException
がスローされることがあります。
SecurityException
- 現在のスレッドがこのスレッドへのアクセスを許されていない場合SecurityManager.checkAccess(Thread)
public String toString()
Object
内の toString
public ClassLoader getContextClassLoader()
セキュリティーマネージャーが存在する場合、呼び出し側のクラスローダーが null ではなく、コンテキストクラスローダーを要求されているスレッドのコンテキストクラスローダーと同じでなく、そのコンテキストクラスローダーの上位オブジェクトでもないときは、コンテキスト ClassLoader を取得してもよいかどうかを確認するために、RuntimePermission("getClassLoader")
アクセス権を使って、セキュリティーマネージャーの checkPermission
メソッドが呼び出されます。
SecurityException
- セキュリティーマネージャーが存在し、セキュリティーマネージャーの checkPermission
メソッドがコンテキスト ClassLoader の取得を許可しない場合setContextClassLoader(java.lang.ClassLoader)
,
SecurityManager.checkPermission(java.security.Permission)
,
RuntimePermission
public void setContextClassLoader(ClassLoader cl)
セキュリティーマネージャーが存在する場合、最初に、コンテキスト ClassLoader を設定してよいかどうかを調べるために RuntimePermission("setContextClassLoader")
アクセス権を使って checkPermission
メソッドが呼び出されます。
cl
- この Thread のコンテキスト ClassLoader
SecurityException
- 現在のスレッドがコンテキスト ClassLoader を設定できない場合getContextClassLoader()
,
SecurityManager.checkPermission(java.security.Permission)
,
RuntimePermission
public static boolean holdsLock(Object obj)
このメソッドは、以下のように、プログラムが、現行スレッドが指定されたロックをすでに保持していることを示す際に使用されます。
assert Thread.holdsLock(obj);
obj
- 所有権のロックをテストするオブジェクト
NullPointerException
- obj が null の場合public StackTraceElement[] getStackTrace()
これはシーケンスで呼び出されたもっとも古いメソッドです。 セキュリティーマネージャーが存在し、このスレッドが現在のスレッドではない場合、スタックトレースを取得してよいかどうかを調べるために、RuntimePermission("getStackTrace") アクセス権を使ってセキュリティーマネージャーの checkPermission メソッドが呼び出されます。
仮想マシンの中には、特定の状況下でスタックトレースから 1 つ以上のスタックフレームを省略するものがあります。極端な場合、このスレッドに関するスタックトレース情報を持たない仮想マシンが、このメソッドから長さゼロの配列を返すことが許可されます。
SecurityException
- セキュリティーマネージャーが存在し、セキュリティーマネージャーの checkPermission メソッドがスレッドのスタックトレースの取得を許可しない場合SecurityManager.checkPermission(java.security.Permission)
,
RuntimePermission
,
Throwable.getStackTrace()
public static Map<Thread,StackTraceElement[]> getAllStackTraces()
getStackTrace
メソッドに対して指定されたフォーマットです。
このメソッドが呼び出されている間に、スレッドが実行されている可能性があります。各スレッドのスタックトレースは、スナップショットを表すだけです。 各スタックトレースは異なる時期に取得できます。仮想マシンがスレッドに関するスタックトレース情報を持たない場合、マップ値に長さゼロの配列が返されます。
セキュリティーマネージャーが存在し、このスレッドが現在のスレッドではない場合、すべてのスレッドのスタックトレースを取得してよいかどうかを調べるために、RuntimePermission("getStackTrace") アクセス権と RuntimePermission("modifyThreadGroup") アクセス権を使ってセキュリティーマネージャーの checkPermission メソッドが呼び出されます。
SecurityException
- セキュリティーマネージャーが存在し、セキュリティーマネージャーの checkPermission メソッドがスレッドのスタックトレースの取得を許可しない場合getStackTrace()
,
SecurityManager.checkPermission(java.security.Permission)
,
RuntimePermission
,
Throwable.getStackTrace()
public long getId()
public Thread.State getState()
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
キャッチされない例外の扱いはスレッドによりまず制御され、次にスレッドの ThreadGroup
オブジェクトにより、最終的にはデフォルトのキャッチされない例外ハンドラにより制御されます。スレッドが明示的なキャッチされない例外ハンドラセットを持たない場合、スレッドのスレッドグループ (親スレッドグループを含む) は、uncaughtException メソッドを特殊化しません。 次に、デフォルトハンドラの uncaughtException メソッドが呼び出されます。
デフォルトのキャッチされない例外ハンドラを設定することで、アプリケーションでは、システムで提供された「デフォルト」の動作をすでに受け入れているスレッドのキャッチされない例外を扱う方法 (特定のデバイスやファイルへのログインなど) を変更できます。
通常、デフォルトのキャッチされない例外ハンドラは、スレッドの ThreadGroup オブジェクトと異なってはいけません。 これは、無限の再帰を招く可能性があるからです。
eh
- デフォルトのキャッチされない例外ハンドラとして使用するオブジェクト。
null の場合、デフォルトのハンドラはない
SecurityException
- セキュリティーマネージャーが存在し、RuntimePermission
("setDefaultUncaughtExceptionHandler") を拒否した場合setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
,
getUncaughtExceptionHandler()
,
ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
キャッチされない例外ハンドラを明示的に設定することで、スレッドはキャッチされない例外を完全に制御できます。このようなハンドラが設定されていない場合は、スレッドの ThreadGroup オブジェクトがハンドラとして機能します。
eh
- スレッドのキャッチされない例外ハンドラとして使用されるオブジェクト。
null の場合、スレッドは明示的なハンドラを持たない
SecurityException
- 現在のスレッドがこのスレッドの変更を許されていない場合setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
,
ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。