- すべての実装されたインタフェース:
Runnable
- 直系の既知のサブクラス:
ForkJoinWorkerThread
各スレッドには優先順位が付けられています。 優先順位の高いスレッドは、優先順位の低いスレッドよりも優先して実行されます。 さらに、各スレッドがデーモンとしてマークされている場合もあれば、されていない場合もあります。 あるスレッドで実行中のコードが新しい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();
各スレッドは識別のための名前を持ちます。 複数のスレッドが同じ名前を持つことがあります。 スレッドの作成時に名前が指定されないと、スレッドには新しい名前が生成されます。
ほかで指定がない場合、null引数をコンストラクタまたはこのクラスのメソッドへ渡すと、NullPointerExceptionがスローされます。
- 導入されたバージョン:
- 1.0
- 関連項目:
-
ネストされたクラスのサマリー
ネストされたクラス修飾子と型クラス説明static enumスレッドの状態です。static interfaceキャッチされない例外により、Threadが突然終了したときに呼び出されるのハンドラのインタフェースです。 -
フィールドのサマリー
フィールド修飾子と型フィールド説明static final intスレッドに設定できる最高優先順位です。static final intスレッドに設定できる最低優先順位です。static final intスレッドに割り当てられるデフォルトの優先順位です。 -
コンストラクタのサマリー
コンストラクタコンストラクタ説明Thread()新しいThreadオブジェクトを割り当てます。新しいThreadオブジェクトを割り当てます。新しいThreadオブジェクトを割り当てます。新しい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を名前として保持するようにします。また、groupによって参照されるスレッド・グループに所属し、指定されたスタック・サイズを保持します。Thread(ThreadGroup group, Runnable target, String name, long stackSize, boolean inheritThreadLocals) オブジェクトとしてtargetを持ち、指定されたnameをその名前とし、groupによって参照されるスレッド・グループに属し、指定されたstackSizeを持ち、inheritThreadLocalsがtrueなら「継承可能なスレッド・ローカル」変数の初期値を継承するように、新しいThreadオブジェクトを割り当てます。Thread(ThreadGroup group, String name) 新しいThreadオブジェクトを割り当てます。 -
メソッドのサマリー
修飾子と型メソッド説明static int現在のスレッドのスレッド・グループとそのサブグループに含まれるアクティブ・スレッドの推定数を返します。final void削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、非推奨であり、今後のリリースで削除される可能性があります。「セキュリティ・マネージャ」と組み合わせて使用すると便利です。protected Objectclone()Threadを意味のあるかたちで複製することは不可能なため、CloneNotSupportedExceptionをスローします。int削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、最初にスタック・フレーム数をカウントするように設計されていましたが、結果は明確に定義されておらず、スレッド機能に依存していました。static Thread現在実行中のスレッド・オブジェクトの参照を返します。static void現在のスレッドのスタック・トレースを標準エラー・ストリームに出力します。static int現行スレッドのスレッド・グループおよびその下位グループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。static Map<Thread,StackTraceElement[]> すべてのライブ・スレッドのスタック・トレース・マップを返します。このスレッドのコンテキストClassLoaderを返します。キャッチされない例外によりスレッドが突然終了したときに呼び出されるデフォルトのハンドラを返します。longgetId()このスレッドの識別子を返します。final StringgetName()このスレッドの名前を返します。final intこのスレッドの優先順位を返します。このスレッドのスタック・ダンプを表すスタック・トレース要素の配列を返します。getState()このスレッドの状態を返します。final ThreadGroupこのスレッドが所属するスレッド・グループを返します。キャッチされない例外によりスレッドが突然終了したときに呼び出されるハンドラを返します。static boolean現行スレッドが指定されたオブジェクトに対するモニター・ロックを保持する場合にのみ、trueを返します。voidこのスレッドに割り込みます。static boolean現在のスレッドが割り込まれているかどうかを調べします。final booleanisAlive()このスレッドが生存しているかどうかを判定します。final booleanisDaemon()このスレッドがデーモン・スレッドであるかどうかを判定します。booleanこのスレッドが割り込まれているどうかを調べます。final voidjoin()このスレッドが終了するのを待機します。final voidjoin(long millis) このスレッドが終了するのを、最高でmillisミリ秒待機します。final voidjoin(long millis, int nanos) 最高でmillisミリ秒にnanosナノ秒を加算した間、このスレッドが終了するのを待機します。static void他のアクティビティの一部で1つ以上のアクションが発生するまで、発信者が瞬間的に進行できないことを示します。final voidresume()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、デッドロックが発生しやすいため非推奨となったsuspend()とともに使用するためにのみ存在します。voidrun()このスレッドが別個のRunnable実行オブジェクトを使用して作成された場合、そのRunnableオブジェクトのrunメソッドが呼び出されます。それ以外の場合、このメソッドは何も行わずに復帰します。voidこのThreadのコンテキストClassLoaderを設定します。final voidsetDaemon(boolean on) このスレッドを、デーモン・スレッドまたはユーザー・スレッドとしてマークします。static voidキャッチされない例外により、スレッドが突然終了したときや、このスレッドに対してほかにハンドラが定義されていないときに呼び出されるデフォルトのハンドラを設定します。final voidこのスレッドの名前を引数nameに等しくなるように変更します。final voidsetPriority(int newPriority) このスレッドの優先順位を変更します。voidキャッチされない例外により、突然スレッドが終了したときに使用されるハンドラを設定します。static voidsleep(long millis) システム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数の間、スリープ(一時的に実行を停止)させます。static voidsleep(long millis, int nanos) システム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数に指定されたナノ秒数を加算した間、スリープ(一時的に実行を停止)させます。voidstart()このスレッドの実行を開始します。Java仮想マシンは、このスレッドのrunメソッドを呼び出します。final voidstop()非推奨。このメソッドは本質的に安全ではありません。final voidsuspend()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、本質的にデッドロックが発生しやすいため非推奨になりました。toString()スレッドの名前、優先順位、スレッド・グループを含むこのスレッドの文字列表現を返します。static voidyield()現在のスレッドが現在のプロセッサ使用量を譲る用意があることを示す、スケジューラへのヒントです。
-
フィールド詳細
-
コンストラクタの詳細
-
Thread
public Thread()新しいThreadオブジェクトを割り当てます。 このコンストラクタは、Thread(null, null, gname)(gnameは新たに生成される名前)と同じ効果を持ちます。 自動的に作成される名前は、nを整数とすると"Thread-"+nの形式を取ります。 -
Thread
public Thread(Runnable target) 新しいThreadオブジェクトを割り当てます。 このコンストラクタは、Thread(null, target, gname)(gnameは新たに生成される名前)と同じ効果を持ちます。 自動的に作成される名前は、nを整数とすると"Thread-"+nの形式を取ります。- パラメータ:
target- このスレッドの起動時に呼び出されるrunメソッドを含むオブジェクト。nullの場合、このクラスのrunメソッドは何も行わない。
-
Thread
public Thread(ThreadGroup group, Runnable target) 新しいThreadオブジェクトを割り当てます。 このコンストラクタは、Thread(group, target, gname)(gnameは新たに生成される名前)と同じ効果を持ちます。 自動的に作成される名前は、nを整数とすると"Thread-"+nの形式を取ります。- パラメータ:
group- スレッド・グループ。nullであり、かつセキュリティ・マネージャが存在する場合、SecurityManager.getThreadGroup()によってグループが決定されます。 セキュリティ・マネージャが存在しない場合やSecurityManager.getThreadGroup()からnullが返される場合、グループは現在のスレッドのスレッド・グループに設定されます。target- このスレッドの起動時に呼び出されるrunメソッドを含むオブジェクト。nullの場合、このスレッドのrunメソッドが呼び出されます。- throws:
SecurityException- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合
-
Thread
public Thread(String name) 新しいThreadオブジェクトを割り当てます。 このコンストラクタは、Thread(null, null, name)と同じ効果を持ちます。- パラメータ:
name- 新しいスレッドの名前
-
Thread
public Thread(ThreadGroup group, String name) 新しいThreadオブジェクトを割り当てます。 このコンストラクタは、Thread(group, null, name)と同じ効果を持ちます。- パラメータ:
group- スレッド・グループ。nullであり、かつセキュリティ・マネージャが存在する場合、SecurityManager.getThreadGroup()によってグループが決定されます。 セキュリティ・マネージャが存在しない場合やSecurityManager.getThreadGroup()からnullが返される場合、グループは現在のスレッドのスレッド・グループに設定されます。name- 新しいスレッドの名前- throws:
SecurityException- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合
-
Thread
新しいThreadオブジェクトを割り当てます。 このコンストラクタは、Thread(null, target, name)と同じ効果を持ちます。- パラメータ:
target- このスレッドの起動時に呼び出されるrunメソッドを含むオブジェクト。nullの場合、このスレッドのrunメソッドが呼び出されます。name- 新しいスレッドの名前
-
Thread
public Thread(ThreadGroup group, Runnable target, String name) その実行オブジェクトとしてtarget、名前として指定されたnameを持つ、groupによって参照されるスレッド・グループに属するような、新しいThreadオブジェクトを割り当てます。セキュリティ・マネージャが存在する場合は、
checkAccessメソッドがThreadGroupをその引数に指定して呼び出されます。さらに、
getContextClassLoaderまたはsetContextClassLoaderメソッドをオーバーライドしたサブクラスのコンストラクタから直接的または間接的に呼び出された場合、そのcheckPermissionメソッドがRuntimePermission("enableContextClassLoaderOverride")アクセス権で呼び出されます。新しく作成されたスレッドの優先順位は、そのスレッドを作成したスレッド、つまり現在実行中のスレッドの優先順位と同じに設定されます。 この優先順位を新しい値に変更する場合は、setPriorityメソッドを使用できます。
新しく作成されたスレッドは、それを作成するスレッドがデーモン・スレッドとマークされている場合にだけ、デーモン・スレッドとマークされます。 スレッドがデーモンであるかどうかを変更する場合は、setDaemonメソッドを使用できます。
- パラメータ:
group- スレッド・グループ。nullであり、かつセキュリティ・マネージャが存在する場合、SecurityManager.getThreadGroup()によってグループが決定されます。 セキュリティ・マネージャが存在しない場合やSecurityManager.getThreadGroup()からnullが返される場合、グループは現在のスレッドのスレッド・グループに設定されます。target- このスレッドの起動時に呼び出されるrunメソッドを含むオブジェクト。nullの場合、このスレッドのrunメソッドが呼び出されます。name- 新しいスレッドの名前- throws:
SecurityException- 現在のスレッドが、指定されたスレッド・グループ内にスレッドを作成できない、またはコンテキスト・クラス・ローダーのメソッドをオーバーライドできない場合。
-
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パラメータを基準にして実装の動作をドキュメント化しておくことをお薦めします。- パラメータ:
group- スレッド・グループ。nullであり、かつセキュリティ・マネージャが存在する場合、SecurityManager.getThreadGroup()によってグループが決定されます。 セキュリティ・マネージャが存在しない場合やSecurityManager.getThreadGroup()からnullが返される場合、グループは現在のスレッドのスレッド・グループに設定されます。target- このスレッドの起動時に呼び出されるrunメソッドを含むオブジェクト。nullの場合、このスレッドのrunメソッドが呼び出されます。name- 新しいスレッドの名前stackSize- 新規スレッドのスタック・サイズまたはゼロ(このパラメータを無視することを示す)。- throws:
SecurityException- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合- 導入されたバージョン:
- 1.4
-
Thread
public Thread(ThreadGroup group, Runnable target, String name, long stackSize, boolean inheritThreadLocals) オブジェクトとしてtargetを持ち、指定されたnameをその名前とし、groupによって参照されるスレッド・グループに属し、指定されたstackSizeを持ち、inheritThreadLocalsがtrueなら「継承可能なスレッド・ローカル」変数の初期値を継承するように、新しいThreadオブジェクトを割り当てます。このコンストラクタは、構築スレッドからの継承可能なスレッド・ローカル変数の初期値を継承するかどうかを指定する機能を追加した
Thread(ThreadGroup,Runnable,String,long)と同じです。 これにより、継承可能なスレッド・ローカルよりも細かい粒度制御が可能になります。inheritThreadLocalsにfalseの値を渡すときは、新しいスレッドが特定のスレッド・ローカル値が継承されることを期待するコードを実行すると、予期しない動作が発生する可能性があるので注意が必要です。inheritThreadLocalsパラメータにtrueの値を指定すると、このコンストラクタはThread(ThreadGroup, Runnable, String, long)コンストラクタとまったく同じように動作します。- パラメータ:
group- スレッド・グループ。nullであり、かつセキュリティ・マネージャが存在する場合、SecurityManager.getThreadGroup()によってグループが決定されます。 セキュリティ・マネージャが存在しない場合やSecurityManager.getThreadGroup()からnullが返される場合、グループは現在のスレッドのスレッド・グループに設定されます。target- このスレッドの起動時に呼び出されるrunメソッドを含むオブジェクト。nullの場合、このスレッドのrunメソッドが呼び出されます。name- 新しいスレッドの名前stackSize- 新しいスレッドの望ましいスタック・サイズ、またはこのパラメータが無視されることを示すゼロinheritThreadLocals-trueが、構築スレッドから継承可能なスレッド・ローカルの初期値を継承する場合、初期値は継承されません。- throws:
SecurityException- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合- 導入されたバージョン:
- 9
-
-
メソッドの詳細
-
currentThread
public static Thread currentThread()現在実行中のスレッド・オブジェクトの参照を返します。- 戻り値:
- 現在実行中のスレッド
-
yield
public static void yield()現在のスレッドが現在のプロセッサ使用量を譲る用意があることを示す、スケジューラへのヒントです。 スケジューラはこのヒントを無視してもかまいません。譲位は、通常であればCPUを過剰に使用してしまうスレッド間で相対的な進行状況を改善しようとするヒューリスティックな試みです。 その使用時には詳細なプロファイルやベンチマークも組み合わせることで、目的の効果が実際に得られていることを確認すべきです。
このメソッドを使用する機会はまれにしかありません。 これは、デバッグ目的やテスト目的で役立つ可能性があります(競合状態によるバグを再現するのに役立つ可能性がある)。 これは、並行制御の構成要素(
java.util.concurrent.locksパッケージ内の構成要素など)を設計する際にも役立つ可能性があります。 -
sleep
public static void sleep(long millis) throws InterruptedException システム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数の間、スリープ(一時的に実行を停止)させます。 スレッドはモニターの所有権を失いません。- パラメータ:
millis- ミリ秒単位のスリープ時間の長さ- throws:
IllegalArgumentException-millisの値が負の場合InterruptedException- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
sleep
public static void sleep(long millis, int nanos) throws InterruptedException システム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数に指定されたナノ秒数を加算した間、スリープ(一時的に実行を停止)させます。 スレッドはモニターの所有権を失いません。- パラメータ:
millis- ミリ秒単位のスリープ時間の長さnanos-0-999999追加でスリープするナノ秒- throws:
IllegalArgumentException-millisの値が負の場合、またはnanosの値が範囲0-999999に含まれない場合InterruptedException- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
onSpinWait
public static void onSpinWait()他のアクティビティの一部で1つ以上のアクションが発生するまで、発信者が瞬間的に進行できないことを示します。 ループ構造の各繰り返し内でこのメソッドを呼び出すことにより、呼び出しスレッドは、ビジー待機中であることをランタイムに示します。 ランタイムは、ループの構築を呼び出す際のパフォーマンスを向上させるための行動を取るかもしれません。- APIのノート:
- 例として、あるフラグがそのメソッドの外に設定されるまで、ループ内で回転するクラス内のメソッドを考えてみましょう。
onSpinWaitメソッドへの呼び出しは、スピン・ループ内に配置する必要があります。class EventHandler { volatile boolean eventNotificationNotReceived; void waitForEventAndHandleIt() { while ( eventNotificationNotReceived ) { java.lang.Thread.onSpinWait(); } readAndProcessEvent(); } void readAndProcessEvent() { // Read event from some source and process it . . . } }上記のコードは、
onSpinWaitメソッドがまったく呼び出されなかった場合でも正しいままです。 しかしながら、いくつかのアーキテクチャでは、Java Virtual Machineは、より有益な方法でそのようなコード・パターンに対処するためにプロセッサ命令を発行してもよい。 - 導入されたバージョン:
- 9
-
clone
protected Object clone() throws CloneNotSupportedExceptionThreadを意味のあるかたちで複製することは不可能なため、CloneNotSupportedExceptionをスローします。 代わりに新しいThreadを構築します。- オーバーライド:
clone、クラスObject- 戻り値:
- このインスタンスの複製。
- throws:
CloneNotSupportedException- 常時- 関連項目:
-
start
public void start()このスレッドの実行を開始します。Java仮想マシンは、このスレッドのrunメソッドを呼び出します。その結果、(
startメソッドへの呼び出しから復帰する)現在のスレッドと(そのrunメソッドを実行する)別のスレッドという2つのスレッドが並列に実行されます。スレッドを複数回起動するのは、決して正しいとは言えません。 特に、スレッドは実行を終えてから再起動することはできません。
- throws:
IllegalThreadStateException- スレッドがすでに起動していた場合。- 関連項目:
-
run
public void run()このスレッドが別個のRunnable実行オブジェクトを使用して作成された場合、そのRunnableオブジェクトのrunメソッドが呼び出されます。それ以外の場合、このメソッドは何も行わずに復帰します。Threadのサブクラスは、このメソッドをオーバーライドしなければなりません。 -
stop
@Deprecated(since="1.2") public final void stop()非推奨。このメソッドは本質的に安全ではありません。 Thread.stopを使ってスレッドを停止すると、チェックされないThreadDeath例外がスタックの下から上に伝えられた結果、そのスレッドによりロックされていたモニターのロックがすべて解除されます。 これらのモニターによって以前保護されていたオブジェクトが整合性のない状態にあった場合、壊れたオブジェクトはほかのスレッドに対して可視になり、動作が保証されないことがあります。 多くの場合、ターゲット・スレッドの実行停止を指示するには、stopではなく、単に一部の変数を変更するコードを使用する必要があります。 ターゲット・スレッドは、この変数を定期的に検査し、実行を停止するべきことを変数が示している場合には、スレッドのrunメソッドから通常の方法で復帰する必要があります。 条件変数などでターゲット・スレッドが長い間待機している場合、待機を中断させるには、interruptメソッドを使用します。 詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。スレッドに強制的に実行を停止させます。セキュリティ・マネージャがインストールされている場合は、
checkAccessメソッドがthisをその引数に指定して呼び出されます。 この結果、現在のスレッドでSecurityExceptionがスローされることがあります。また、このスレッドが現在のスレッドと異なる場合、つまり、現在のスレッドが自分以外のスレッドを停止しようとしている場合は、
RuntimePermission("stopThread")を引数として、セキュリティ・マネージャのcheckPermissionメソッドも呼び出されます。 この場合にも、現在のスレッドでSecurityExceptionがスローされることがあります。このスレッドによって表されるスレッドは、それが実行していた動作に関係なく強制的に異常停止させられ、新しく生成した
ThreadDeathオブジェクトを例外としてスローします。まだ起動されていないスレッドを停止することができます。 スレッドが最終的に起動されると、すぐに終了します。
アプリケーションは、通常とは異なるクリーンアップ動作を実行しなければならない場合を除き、
ThreadDeathをキャッチすべきではありません。ただし、ThreadDeathをスローすると、スレッドが正式に終了する前にtry文のfinally節が実行されることに注意してください。catch節がThreadDeathオブジェクトをキャッチする場合は、スレッドが実際に終了するようにオブジェクトをスローし直すことが重要です。そうでない場合、キャッチされていない例外を扱う最高レベルのエラー・ハンドラは、キャッチされていない例外が
ThreadDeathのインスタンスであれば、メッセージを出力したり、アプリケーションに通知したりすることはしません。 -
interrupt
public void interrupt()このスレッドに割り込みます。現在のスレッドが自身への割り込み(常に許可される)を行うのでないかぎり、このスレッドの
checkAccessメソッドが呼び出されますが、その際、SecurityExceptionがスローされる可能性があります。このスレッドが、
Objectクラス、またはjoin()、join(long)、join(long, int)、sleep(long)、またはsleep(long, int)メソッドのwait()、wait(long)、またはwait(long, int)メソッドの呼び出しでブロックされている場合、割込みステータスはクリアされ、InterruptedExceptionを受け取ります。InterruptibleChannelに対するI/O操作でこのスレッドがブロックされる場合、チャネルは閉じられ、スレッドの割込みステータスが設定されます。また、スレッドはClosedByInterruptExceptionを受け取ります。Selectorでこのスレッドがブロックされる場合、スレッドの割込みステータスが設定されて、選択操作から即座に返されます。通常、返される値は、セレクタのwakeupメソッドが呼び出された場合と同じく、ゼロ以外の値になります。前述の条件のどれにも当てはまらない場合、このスレッドの割込みステータスが設定されます。
生存していないスレッドが割込みを受けることが、効果を持つ必要がない場合。
- 実装上のノート:
- JDKリファレンス実装では、中断されたリクエストがまだ記録されていないスレッドの割込みによって、
interruptedおよびisInterrupted()によってレポートされます。 - throws:
SecurityException- 現在のスレッドがこのスレッドを変更できない場合
-
interrupted
public static boolean interrupted()現在のスレッドが割り込まれているかどうかを調べします。 このメソッドによりスレッドの割込みステータスがクリアされます。 つまり、このメソッドが続けて2回呼び出された場合、2回目の呼出しはfalseを返します(最初の呼出しが割込みステータスをクリアしたあとで、2番目の呼出しがそれを確認する前に現在のスレッドがもう一度割り込まれた場合を除く)。- 戻り値:
- 現在のスレッドが割り込まれている場合は
true、そうでない場合はfalse。 - 関連項目:
-
isInterrupted
public boolean isInterrupted()このスレッドが割り込まれているどうかを調べます。 このメソッドによってスレッドの割込みステータスが影響を受けることはありません。- 戻り値:
- このスレッドが割り込まれている場合は
true、そうでない場合はfalse。 - 関連項目:
-
isAlive
public final boolean isAlive()このスレッドが生存しているかどうかを判定します。 スレッドが起動され、生存している場合、スレッドは生存しています。- 戻り値:
- このスレッドが生存している場合は
true、そうでない場合はfalse。
-
suspend
@Deprecated(since="1.2", forRemoval=true) public final void suspend()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、本質的にデッドロックが発生しやすいため非推奨になりました。 ターゲット・スレッドが、中断される時点で、重要なシステム・リソースを保護するモニターをロックしている場合、ターゲット・スレッドが再開されるまでどのスレッドもそのリソースにアクセスできません。 このとき、ターゲット・スレッドを再開するスレッドが、resumeを呼び出す前にこのモニターをロックしようとすると、デッドロックが発生します。 通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。 詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。このスレッドを中断します。まず、このスレッドの
checkAccessメソッドが、引数なしで呼び出されます。 この結果、現在のスレッドでSecurityExceptionがスローされることがあります。スレッドは、生存している場合に中断され、再開されない処理を先に進めることはできません。
- throws:
SecurityException- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
-
resume
@Deprecated(since="1.2", forRemoval=true) public final void resume()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、デッドロックが発生しやすいため非推奨となったsuspend()とともに使用するためにのみ存在します。 詳細は、「Thread.stop、Thread.suspendおよびThread.resumeが非推奨になったのはなぜですか。」を参照してください。中断されたスレッドを再開します。まず、このスレッドの
checkAccessメソッドが、引数なしで呼び出されます。 この結果、現在のスレッドでSecurityExceptionがスローされることがあります。スレッドは、生存しているが中断されている場合、実行が再開されて処理を先に進ませることが許可されます。
- throws:
SecurityException- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
-
setPriority
public final void setPriority(int newPriority) このスレッドの優先順位を変更します。まず、このスレッドの
checkAccessメソッドが、引数なしで呼び出されます。 その結果、SecurityExceptionがスローされることがあります。そうでない場合、このスレッドの優先順位は、指定された
newPriorityとスレッドのスレッド・グループの最高許容優先順位の内のどちらか小さい方に設定されます。- パラメータ:
newPriority- このスレッドを設定する優先順位- throws:
IllegalArgumentException- 優先順位がMIN_PRIORITYからMAX_PRIORITYの範囲外である場合。SecurityException- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
-
getPriority
public final int getPriority()このスレッドの優先順位を返します。- 戻り値:
- このスレッドの優先順位。
- 関連項目:
-
setName
public final void setName(String name) このスレッドの名前を引数nameに等しくなるように変更します。まず、このスレッドの
checkAccessメソッドが、引数なしで呼び出されます。 その結果、SecurityExceptionがスローされることがあります。- パラメータ:
name- このスレッドの新しい名前。- throws:
SecurityException- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
-
getName
public final String getName()このスレッドの名前を返します。- 戻り値:
- このスレッドの名前。
- 関連項目:
-
getThreadGroup
public final ThreadGroup getThreadGroup()このスレッドが所属するスレッド・グループを返します。 このスレッドが終了されている(停止されている)場合、このメソッドはnullを返します。- 戻り値:
- このスレッドのスレッド・グループ。
-
activeCount
public static int activeCount()現在のスレッドのスレッド・グループとそのサブグループに含まれるアクティブ・スレッドの推定数を返します。 現在のスレッドのスレッド・グループ内のすべてのサブグループに対して再帰的な反復処理を行います。返される値は単なる推定値ですが、それは、このメソッドが内部のデータ構造体をトラバースしている間にスレッド数が動的に変化する可能性があるほか、特定のシステム・スレッドの存在の影響を受ける可能性もあるからです。 このメソッドは主に、デバッグおよび監視目的のためのものです。
- 戻り値:
- 現在のスレッドのスレッド・グループ内、および現在のスレッドのスレッド・グループを上位グループとして持つ他のすべてのスレッド・グループ内の、アクティブ・スレッドの推定数
-
enumerate
public static int enumerate(Thread[] tarray) 現行スレッドのスレッド・グループおよびその下位グループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。 このメソッドは単純に、現在のスレッドのスレッド・グループのThreadGroup.enumerate(Thread[])メソッドを呼び出します。アプリケーションでは、配列がどの程度の大きさになるかについておよその数を取得するためにactiveCountメソッドを使用する場合があります。ただし、配列が小さすぎてすべてのスレッドを保持できない場合、余分なスレッドは通知なしに無視されます。 現在のスレッドのスレッド・グループとそのサブグループにあるすべてのアクティブ・スレッドを取得することが重要な場合、呼出し側は返された整数値が厳密に
tarrayの長さ未満であることを確認する必要があります。このメソッドの本質的な競合条件のため、このメソッドはデバッグおよび監視目的にのみ使用することをお薦めします。
- パラメータ:
tarray- スレッドのリストの格納先である配列- 戻り値:
- 配列に格納されるスレッド数
- throws:
SecurityException- 現在のスレッドがそのスレッド・グループにアクセスできないとThreadGroup.checkAccess()によって判定された場合
-
countStackFrames
@Deprecated(since="1.2", forRemoval=true) public int countStackFrames()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、最初にスタック・フレーム数をカウントするように設計されていましたが、結果は明確に定義されておらず、スレッド機能に依存していました。 このメソッドは、Java SEの将来のバージョンで削除される可能性があります。UnsupportedOperationExceptionをスローします。- 戻り値:
- なし
- 関連項目:
-
join
public final void join(long millis) throws InterruptedException このスレッドが終了するのを、最高でmillisミリ秒待機します。0のタイム・アウトは無期限に待機することを意味します。この実装では、
this.isAliveが条件として与えられたthis.wait呼出しのループを使用します。 スレッドが終了すると、this.notifyAllメソッドが呼び出されます。 アプリケーションでは、Threadインスタンスのwait、notify、またはnotifyAllを使用しないことをお薦めします。- パラメータ:
millis- ミリ秒単位の待機時間- throws:
IllegalArgumentException-millisの値が負の場合InterruptedException- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
join
public final void join(long millis, int nanos) throws InterruptedException 最高でmillisミリ秒にnanosナノ秒を加算した間、このスレッドが終了するのを待機します。 両方の引数が0の場合は、永続的に待機することを意味します。この実装では、
this.isAliveが条件として与えられたthis.wait呼出しのループを使用します。 スレッドが終了すると、this.notifyAllメソッドが呼び出されます。 アプリケーションでは、Threadインスタンスのwait、notify、またはnotifyAllを使用しないことをお薦めします。- パラメータ:
millis- ミリ秒単位の待機時間nanos-0-999999追加で待機するナノ秒- throws:
IllegalArgumentException-millisの値が負の場合、またはnanosの値が範囲0-999999に含まれない場合InterruptedException- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
join
public final void join() throws InterruptedException- throws:
InterruptedException- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
dumpStack
public static void dumpStack()現在のスレッドのスタック・トレースを標準エラー・ストリームに出力します。 このメソッドはデバッグの場合にだけ使用します。 -
setDaemon
public final void setDaemon(boolean on) このスレッドを、デーモン・スレッドまたはユーザー・スレッドとしてマークします。 Java仮想マシンは、実行中のスレッドがデーモン・スレッドだけになると終了します。このメソッドは、スレッド起動前に呼び出す必要があります。
- パラメータ:
on-trueの場合、このスレッドをデーモン・スレッドとしてマークする- throws:
IllegalThreadStateException- このスレッドが生存している場合SecurityException- 現在のスレッドがこのスレッドを変更できない場合とcheckAccess()によって判定された場合
-
isDaemon
public final boolean isDaemon()このスレッドがデーモン・スレッドであるかどうかを判定します。- 戻り値:
- このスレッドがデーモン・スレッドである場合は
true、そうでない場合はfalse。 - 関連項目:
-
checkAccess
@Deprecated(since="17", forRemoval=true) public final void checkAccess()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、非推奨であり、今後のリリースで削除される可能性があります。「セキュリティ・マネージャ」と組み合わせて使用すると便利です。 そのため、このメソッドは非推奨であり、削除される可能性があります。 Security Managerまたはこのメソッドに置換はありません。現在実行中のスレッドが、このスレッドを変更するためのアクセス権を持っているかどうかを判定します。セキュリティ・マネージャが存在する場合は、
checkAccessメソッドがこのスレッドをその引数に指定して呼び出されます。 その結果、SecurityExceptionがスローされることがあります。- throws:
SecurityException- 現在のスレッドがこのスレッドへのアクセスを許されていない場合。- 関連項目:
-
toString
public String toString()スレッドの名前、優先順位、スレッド・グループを含むこのスレッドの文字列表現を返します。 -
getContextClassLoader
public ClassLoader getContextClassLoader()このスレッドのコンテキストClassLoaderを返します。 コンテキストClassLoaderは、クラスおよびリソースのロード時にこのスレッドで実行されるコードで使用するために、スレッドの作成者によって提供されます。 setでない場合、デフォルトは親スレッドのClassLoaderコンテキストです。 基本スレッドのコンテキストClassLoaderは、通常、アプリケーションをロードするために使用されるクラス・ローダーに設定されます。- 戻り値:
- このスレッドのコンテキスト
ClassLoader、またはシステム・クラス・ローダーを示すnull(それに失敗した場合、ブートストラップ・クラス・ローダー) - throws:
SecurityException- セキュリティ・マネージャが存在し、呼び出し側クラス・ローダーがnullでなく、コンテキスト・クラス・ローダーと同じでも祖先でもなく、呼び出し元にRuntimePermission("getClassLoader")がない場合- 導入されたバージョン:
- 1.2
-
setContextClassLoader
public void setContextClassLoader(ClassLoader cl) このThreadのコンテキストClassLoaderを設定します。 コンテキストClassLoaderはスレッドの作成時に設定され、これによりスレッドの作成側は、クラスおよびリソースのロード時にスレッドで実行中のコードに(getContextClassLoader経由で)適切なクラス・ローダーを提供できるようになります。セキュリティ・マネージャが存在する場合、その
checkPermissionメソッドがRuntimePermission("setContextClassLoader")アクセス権で呼び出され、コンテキストClassLoaderの設定が許可されるか確認されます。- パラメータ:
cl- このThreadのコンテキストClassLoader、またはシステム・クラス・ローダーを示す(またはブートストラップ・クラス・ローダーの失敗を示す) null- throws:
SecurityException- 現在のスレッドがコンテキストClassLoaderを設定できない場合- 導入されたバージョン:
- 1.2
-
holdsLock
public static boolean holdsLock(Object obj) 現行スレッドが指定されたオブジェクトに対するモニター・ロックを保持する場合にのみ、trueを返します。このメソッドは、次のように、プログラムが、現行スレッドが指定されたロックをすでに保持していることを示す際に使用されます。
assert Thread.holdsLock(obj);- パラメータ:
obj- 所有権のロックをテストするオブジェクト- 戻り値:
- 現行スレッドが指定されたオブジェクトに対するモニター・ロックを保持する場合、
trueが返される。 - throws:
NullPointerException- objがnullの場合- 導入されたバージョン:
- 1.4
-
getStackTrace
public StackTraceElement[] getStackTrace()このスレッドのスタック・ダンプを表すスタック・トレース要素の配列を返します。 このスレッドが開始されていないか、開始済みだがまだシステムによって実行対象としてスケジュールされていないか、あるいは終了済みの場合、このメソッドから長さゼロの配列が返されます。 返された配列がゼロ以外の長さの配列である場合、配列の最初の要素はスタックの最上部を表します。これはシーケンスで呼び出されたもっとも新しいメソッドです。 配列の最後の要素は、スタックの底部を表します。これはシーケンスで呼び出されたもっとも古いメソッドです。これはシーケンスで呼び出されたもっとも古いメソッドです。セキュリティ・マネージャが存在し、このスレッドが現在のスレッドではない場合、スタック・トレースを取得してよいかどうかを調べるために、
RuntimePermission("getStackTrace")アクセス権を使ってセキュリティ・マネージャのcheckPermissionメソッドが呼び出されます。仮想マシンの中には、特定の状況下でスタック・トレースから1つ以上のスタック・フレームを省略するものがあります。 極端な場合、このスレッドに関するスタック・トレース情報を持たない仮想マシンが、このメソッドから長さゼロの配列を返すことが許可されます。
- 戻り値:
- 1つのスタック・フレームを表す
StackTraceElementの配列。 - throws:
SecurityException- セキュリティ・マネージャが存在し、そのcheckPermissionメソッドがスレッドのスタック・トレースの取得を許可しない場合。- 導入されたバージョン:
- 1.5
- 関連項目:
-
getAllStackTraces
public static Map<Thread,StackTraceElement[]> getAllStackTraces()すべてのライブ・スレッドのスタック・トレース・マップを返します。 マップ・キーはスレッドです。また、各マップの値は対応するThreadのスタック・ダンプを表すStackTraceElementの配列です。 返されるスタック・トレースのフォーマットは、getStackTraceメソッドで指定されたものとなります。このメソッドが呼び出されている間に、スレッドが実行されている可能性があります。 各スレッドのスタック・トレースは、スナップショットを表すだけです。各スタック・トレースは異なる時期に取得できます。 仮想マシンがスレッドに関するスタック・トレース情報を持たない場合、マップ値に長さゼロの配列が返されます。
セキュリティ・マネージャが存在し、このスレッドが現在のスレッドではない場合、すべてのスレッドのスタック・トレースを取得してよいかどうかを調べるために、
RuntimePermission("getStackTrace")アクセス権とRuntimePermission("modifyThreadGroup")アクセス権を使ってセキュリティ・マネージャのcheckPermissionメソッドが呼び出されます。- 戻り値:
Threadから、対応するスレッドのスタック・トレースを表すStackTraceElementの配列へのMap。- throws:
SecurityException- セキュリティ・マネージャが存在し、そのcheckPermissionメソッドがスレッドのスタック・トレースの取得を許可しない場合。- 導入されたバージョン:
- 1.5
- 関連項目:
-
getId
public long getId()このスレッドの識別子を返します。 スレッドIDは、スレッドが作成されたときに生成された正のlong型の数字です。 スレッドIDは一意であり、その寿命を通じて変更されることはありません。 スレッドが終了すると、スレッドIDは再利用可能です。- 戻り値:
- このスレッドのID。
- 導入されたバージョン:
- 1.5
-
getState
public Thread.State getState()このスレッドの状態を返します。 このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。- 戻り値:
- このスレッドの状態。
- 導入されたバージョン:
- 1.5
-
setDefaultUncaughtExceptionHandler
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) キャッチされない例外により、スレッドが突然終了したときや、このスレッドに対してほかにハンドラが定義されていないときに呼び出されるデフォルトのハンドラを設定します。キャッチされない例外の扱いはスレッドによりまず制御され、次にスレッドの
ThreadGroupオブジェクトにより、最終的にはデフォルトのキャッチされない例外ハンドラにより制御されます。 スレッドが明示的なキャッチされない例外ハンドラ・セットを持たない場合、スレッドのスレッド・グループ(親スレッド・グループを含む)は、uncaughtExceptionメソッドを特殊化しません。次に、デフォルト・ハンドラのuncaughtExceptionメソッドが呼び出されます。デフォルトのキャッチされない例外ハンドラを設定することで、アプリケーションでは、システムで提供された「デフォルト」の動作をすでに受け入れているスレッドのキャッチされない例外を扱う方法(特定のデバイスやファイルへのログインなど)を変更できます。
通常、デフォルトのキャッチされない例外ハンドラは、スレッドの
ThreadGroupオブジェクトと異なってはいけません。これは、無限の再帰を招く可能性があるからです。- パラメータ:
eh- デフォルトのキャッチされない例外ハンドラとして使用するオブジェクト。nullの場合、デフォルトのハンドラはない。- throws:
SecurityException- セキュリティ・マネージャが存在し、RuntimePermission("setDefaultUncaughtExceptionHandler")を拒否した場合- 導入されたバージョン:
- 1.5
- 関連項目:
-
getDefaultUncaughtExceptionHandler
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()キャッチされない例外によりスレッドが突然終了したときに呼び出されるデフォルトのハンドラを返します。 戻り値がnullの場合、デフォルトのハンドラはありません。- 戻り値:
- すべてのスレッド用のデフォルトのキャッチされない例外ハンドラ
- 導入されたバージョン:
- 1.5
- 関連項目:
-
getUncaughtExceptionHandler
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()キャッチされない例外によりスレッドが突然終了したときに呼び出されるハンドラを返します。 このスレッドが明示的に設定されたキャッチされない例外ハンドラを持たない場合、スレッドが終了しないかぎり、スレッドのThreadGroupオブジェクトが返されます。この場合、nullが返されます。- 戻り値:
- このスレッド用のキャッチされない例外ハンドラ
- 導入されたバージョン:
- 1.5
-
setUncaughtExceptionHandler
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) キャッチされない例外により、突然スレッドが終了したときに使用されるハンドラを設定します。キャッチされない例外ハンドラを明示的に設定することで、スレッドはキャッチされない例外を完全に制御できます。 このようなハンドラが設定されていない場合は、スレッドの
ThreadGroupオブジェクトがハンドラとして機能します。- パラメータ:
eh- スレッドのキャッチされない例外ハンドラとして使用されるオブジェクト。nullの場合、スレッドは明示的なハンドラを持たない。- throws:
SecurityException- 現在のスレッドがこのスレッドの変更を許されていない場合。- 導入されたバージョン:
- 1.5
- 関連項目:
-