- すべての実装されたインタフェース:
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
- 関連項目:
Runnable
,Runtime.exit(int)
,run()
,stop()
-
ネストされたクラスのサマリー
ネストされたクラス修飾子と型クラス説明static class
スレッドの状態です。static interface
キャッチされない例外により、Thread
が突然終了したときに呼び出されるのハンドラのインタフェースです。 -
フィールドのサマリー
フィールド修飾子と型フィールド説明static int
スレッドに設定できる最高優先順位です。static int
スレッドに設定できる最低優先順位です。static 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
現在のスレッドのスレッド・グループとそのサブグループに含まれるアクティブ・スレッドの推定数を返します。void
現在実行中のスレッドが、このスレッドを変更するためのアクセス権を持っているかどうかを判定します。protected Object
clone()
Threadを意味のあるかたちで複製することは不可能なため、CloneNotSupportedExceptionをスローします。int
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、最初にスタック・フレーム数をカウントするように設計されていましたが、結果は明確に定義されておらず、スレッド機能に依存していました。static Thread
現在実行中のスレッド・オブジェクトの参照を返します。static void
現在のスレッドのスタック・トレースを標準エラー・ストリームに出力します。static int
現行スレッドのスレッド・グループおよびその下位グループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。static Map<Thread,StackTraceElement[]>
すべてのライブ・スレッドのスタック・トレース・マップを返します。このスレッドのコンテキストClassLoader
を返します。キャッチされない例外によりスレッドが突然終了したときに呼び出されるデフォルトのハンドラを返します。long
getId()
このスレッドの識別子を返します。getName()
このスレッドの名前を返します。int
このスレッドの優先順位を返します。このスレッドのスタック・ダンプを表すスタック・トレース要素の配列を返します。getState()
このスレッドの状態を返します。このスレッドが所属するスレッド・グループを返します。キャッチされない例外によりスレッドが突然終了したときに呼び出されるハンドラを返します。static boolean
現行スレッドが指定されたオブジェクトに対するモニター・ロックを保持する場合にのみ、true
を返します。void
このスレッドに割り込みます。static boolean
現在のスレッドが割り込まれているかどうかを調べします。boolean
isAlive()
このスレッドが生存しているかどうかを判定します。boolean
isDaemon()
このスレッドがデーモン・スレッドであるかどうかを判定します。boolean
このスレッドが割り込まれているどうかを調べます。void
join()
このスレッドが終了するのを待機します。void
join(long millis)
このスレッドが終了するのを、最高でmillis
ミリ秒待機します。void
join(long millis, int nanos)
最高でmillis
ミリ秒にnanos
ナノ秒を加算した間、このスレッドが終了するのを待機します。static void
他のアクティビティの一部で1つ以上のアクションが発生するまで、発信者が瞬間的に進行できないことを示します。void
resume()
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドはsuspend()
とともに使用するためにのみ存在しますが、これはデッドロックを発生させやすいため推奨されていません。void
run()
このスレッドが別個のRunnable
実行オブジェクトを使用して作成された場合、そのRunnable
オブジェクトのrun
メソッドが呼び出されます。それ以外の場合、このメソッドは何も行わずに復帰します。void
このThreadのコンテキストClassLoaderを設定します。void
setDaemon(boolean on)
このスレッドを、デーモン・スレッドまたはユーザー・スレッドとしてマークします。static void
キャッチされない例外により、スレッドが突然終了したときや、このスレッドに対してほかにハンドラが定義されていないときに呼び出されるデフォルトのハンドラを設定します。void
このスレッドの名前を引数name
に等しくなるように変更します。void
setPriority(int newPriority)
このスレッドの優先順位を変更します。void
キャッチされない例外により、突然スレッドが終了したときに使用されるハンドラを設定します。static void
sleep(long millis)
システム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数の間、スリープ(一時的に実行を停止)させます。static void
sleep(long millis, int nanos)
システム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数に指定されたナノ秒数を加算した間、スリープ(一時的に実行を停止)させます。void
start()
このスレッドの実行を開始します。Java仮想マシンは、このスレッドのrun
メソッドを呼び出します。void
stop()
非推奨。このメソッドは本質的に安全ではありません。void
suspend()
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドはデッドロックを発生しやすいため非推奨です。toString()
スレッドの名前、優先順位、スレッド・グループを含むこのスレッドの文字列表現を返します。static void
yield()
現在のスレッドが現在のプロセッサ使用量を譲る用意があることを示す、スケジューラへのヒントです。
-
フィールド詳細
-
コンストラクタの詳細
-
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メソッドが呼び出されます。- 例外:
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
- 新しいスレッドの名前- 例外:
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
- 新しいスレッドの名前- 例外:
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
- 新規スレッドのスタック・サイズまたはゼロ(このパラメータを無視することを示す)。- 例外:
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
が、構築スレッドから継承可能なスレッド・ローカルの初期値を継承する場合、初期値は継承されません。- 例外:
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
- ミリ秒単位のスリープ時間の長さ- 例外:
IllegalArgumentException
-millis
の値が負の場合InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
sleep
public static void sleep(long millis, int nanos) throws InterruptedExceptionシステム・タイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数に指定されたナノ秒数を加算した間、スリープ(一時的に実行を停止)させます。 スレッドはモニターの所有権を失いません。- パラメータ:
millis
- ミリ秒単位のスリープ時間の長さnanos
-0-999999
追加でスリープするナノ秒- 例外:
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
- 戻り値:
- このインスタンスの複製。
- 例外:
CloneNotSupportedException
- 常時- 関連項目:
Cloneable
-
start
public void start()このスレッドの実行を開始します。Java仮想マシンは、このスレッドのrun
メソッドを呼び出します。その結果、(
start
メソッドへの呼び出しから復帰する)現在のスレッドと(そのrun
メソッドを実行する)別のスレッドという2つのスレッドが並列に実行されます。スレッドを複数回起動するのは、決して正しいとは言えません。 特に、スレッドは実行を終えてから再起動することはできません。
- 例外:
IllegalThreadStateException
- スレッドがすでに起動していた場合。- 関連項目:
run()
,stop()
-
run
public void run()このスレッドが別個のRunnable
実行オブジェクトを使用して作成された場合、そのRunnable
オブジェクトのrun
メソッドが呼び出されます。それ以外の場合、このメソッドは何も行わずに復帰します。Thread
のサブクラスは、このメソッドをオーバーライドしなければなりません。- 定義:
run
、インタフェース:Runnable
- 関連項目:
start()
,stop()
,Thread(ThreadGroup, Runnable, String)
-
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
のインスタンスであれば、メッセージを出力したり、アプリケーションに通知したりすることはしません。- 例外:
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
interrupt()
,checkAccess()
,run()
,start()
,ThreadDeath
,ThreadGroup.uncaughtException(Thread,Throwable)
,SecurityManager.checkAccess(Thread)
,SecurityManager.checkPermission(java.security.Permission)
-
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()
によってレポートされます。 - 例外:
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合
-
interrupted
public static boolean interrupted()現在のスレッドが割り込まれているかどうかを調べします。 このメソッドによりスレッドの割込みステータスがクリアされます。 つまり、このメソッドが続けて2回呼び出された場合、2回目の呼出しはfalseを返します(最初の呼出しが割込みステータスをクリアしたあとで、2番目の呼出しがそれを確認する前に現在のスレッドがもう一度割り込まれた場合を除く)。- 戻り値:
- 現在のスレッドが割り込まれている場合は
true
、そうでない場合はfalse
。 - 関連項目:
isInterrupted()
-
isInterrupted
public boolean isInterrupted()このスレッドが割り込まれているどうかを調べます。 このメソッドによってスレッドの割込みステータスが影響を受けることはありません。- 戻り値:
- このスレッドが割り込まれている場合は
true
、そうでない場合はfalse
。 - 関連項目:
interrupted()
-
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
がスローされることがあります。スレッドは、生存している場合に中断され、再開されない処理を先に進めることはできません。
- 例外:
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
checkAccess()
-
resume
@Deprecated(since="1.2", forRemoval=true) public final void resume()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドはsuspend()
とともに使用するためにのみ存在しますが、これはデッドロックを発生させやすいため推奨されていません。 詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。中断されたスレッドを再開します。まず、このスレッドの
checkAccess
メソッドが、引数なしで呼び出されます。 この結果、現在のスレッドでSecurityException
がスローされることがあります。スレッドは、生存しているが中断されている場合、実行が再開されて処理を先に進ませることが許可されます。
- 例外:
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
checkAccess()
,suspend()
-
setPriority
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()
-
getPriority
public final int getPriority()このスレッドの優先順位を返します。- 戻り値:
- このスレッドの優先順位。
- 関連項目:
setPriority(int)
-
setName
public final void setName(String name)このスレッドの名前を引数name
に等しくなるように変更します。まず、このスレッドの
checkAccess
メソッドが、引数なしで呼び出されます。 その結果、SecurityException
がスローされることがあります。- パラメータ:
name
- このスレッドの新しい名前。- 例外:
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合。- 関連項目:
getName()
,checkAccess()
-
getName
public final String getName()このスレッドの名前を返します。- 戻り値:
- このスレッドの名前。
- 関連項目:
setName(String)
-
getThreadGroup
public final ThreadGroup getThreadGroup()このスレッドが所属するスレッド・グループを返します。 このスレッドが終了されている(停止されている)場合、このメソッドはnullを返します。- 戻り値:
- このスレッドのスレッド・グループ。
-
activeCount
public static int activeCount()現在のスレッドのスレッド・グループとそのサブグループに含まれるアクティブ・スレッドの推定数を返します。 現在のスレッドのスレッド・グループ内のすべてのサブグループに対して再帰的な反復処理を行います。返される値は単なる推定値ですが、それは、このメソッドが内部のデータ構造体をトラバースしている間にスレッド数が動的に変化する可能性があるほか、特定のシステム・スレッドの存在の影響を受ける可能性もあるからです。 このメソッドは主に、デバッグおよび監視目的のためのものです。
- 戻り値:
- 現在のスレッドのスレッド・グループ内、および現在のスレッドのスレッド・グループを上位グループとして持つ他のすべてのスレッド・グループ内の、アクティブ・スレッドの推定数
-
enumerate
public static int enumerate(Thread[] tarray)現行スレッドのスレッド・グループおよびその下位グループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。 このメソッドは単純に、現在のスレッドのスレッド・グループのThreadGroup.enumerate(Thread[])
メソッドを呼び出します。アプリケーションでは、配列がどの程度の大きさになるかについておよその数を取得するためにactiveCountメソッドを使用する場合があります。ただし、配列が小さすぎてすべてのスレッドを保持できない場合、余分なスレッドは通知なしに無視されます。 現在のスレッドのスレッド・グループとそのサブグループにあるすべてのアクティブ・スレッドを取得することが重要な場合、呼出し側は返された整数値が厳密に
tarray
の長さ未満であることを確認する必要があります。このメソッドの本質的な競合条件のため、このメソッドはデバッグおよび監視目的にのみ使用することをお薦めします。
- パラメータ:
tarray
- スレッドのリストの格納先である配列- 戻り値:
- 配列に格納されるスレッド数
- 例外:
SecurityException
- 現在のスレッドがそのスレッド・グループにアクセスできないとThreadGroup.checkAccess()
によって判定された場合
-
countStackFrames
@Deprecated(since="1.2", forRemoval=true) public int countStackFrames()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。このメソッドは、最初にスタック・フレーム数をカウントするように設計されていましたが、結果は明確に定義されておらず、スレッド機能に依存していました。 このメソッドは、Java SEの将来のバージョンで削除される可能性があります。UnsupportedOperationException
をスローします。- 戻り値:
- なし
- 関連項目:
StackWalker
-
join
public final void join(long millis) throws InterruptedExceptionこのスレッドが終了するのを、最高でmillis
ミリ秒待機します。0
のタイム・アウトは無期限に待機することを意味します。この実装では、
this.isAlive
が条件として与えられたthis.wait
呼出しのループを使用します。 スレッドが終了すると、this.notifyAll
メソッドが呼び出されます。 アプリケーションでは、Thread
インスタンスのwait
、notify
、またはnotifyAll
を使用しないことをお薦めします。- パラメータ:
millis
- ミリ秒単位の待機時間- 例外:
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
追加で待機するナノ秒- 例外:
IllegalArgumentException
-millis
の値が負の場合、またはnanos
の値が範囲0-999999
に含まれない場合InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
join
public final void join() throws InterruptedException- 例外:
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。
-
dumpStack
public static void dumpStack()現在のスレッドのスタック・トレースを標準エラー・ストリームに出力します。 このメソッドはデバッグの場合にだけ使用します。 -
setDaemon
public final void setDaemon(boolean on)このスレッドを、デーモン・スレッドまたはユーザー・スレッドとしてマークします。 Java仮想マシンは、実行中のスレッドがデーモン・スレッドだけになると終了します。このメソッドは、スレッド起動前に呼び出す必要があります。
- パラメータ:
on
-true
の場合、このスレッドをデーモン・スレッドとしてマークする- 例外:
IllegalThreadStateException
- このスレッドが生存している場合SecurityException
- 現在のスレッドがこのスレッドを変更できない場合とcheckAccess()
によって判定された場合
-
isDaemon
public final boolean isDaemon()このスレッドがデーモン・スレッドであるかどうかを判定します。- 戻り値:
- このスレッドがデーモン・スレッドである場合は
true
、そうでない場合はfalse
。 - 関連項目:
setDaemon(boolean)
-
checkAccess
public final void checkAccess()現在実行中のスレッドが、このスレッドを変更するためのアクセス権を持っているかどうかを判定します。セキュリティ・マネージャが存在する場合は、
checkAccess
メソッドがこのスレッドをその引数に指定して呼び出されます。 その結果、SecurityException
がスローされることがあります。- 例外:
SecurityException
- 現在のスレッドがこのスレッドへのアクセスを許されていない場合。- 関連項目:
SecurityManager.checkAccess(Thread)
-
toString
public String toString()スレッドの名前、優先順位、スレッド・グループを含むこのスレッドの文字列表現を返します。 -
getContextClassLoader
public ClassLoader getContextClassLoader()このスレッドのコンテキストClassLoader
を返します。 コンテキストClassLoader
は、クラスおよびリソースのロード時にこのスレッドで実行されるコードで使用するために、スレッドの作成者によって提供されます。 setでない場合、デフォルトは親スレッドのClassLoader
コンテキストです。 基本スレッドのコンテキストClassLoader
は、通常、アプリケーションをロードするために使用されるクラス・ローダーに設定されます。- 戻り値:
- このスレッドのコンテキスト
ClassLoader
、またはシステム・クラス・ローダーを示すnull
(それに失敗した場合、ブートストラップ・クラス・ローダー) - 例外:
SecurityException
- セキュリティ・マネージャが存在し、呼び出し側クラス・ローダーがnull
でなく、コンテキスト・クラス・ローダーと同じでも祖先でもなく、呼び出し元にRuntimePermission
("getClassLoader")
がない場合- 導入されたバージョン:
- 1.2
-
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)このThreadのコンテキストClassLoaderを設定します。 コンテキストClassLoaderはスレッドの作成時に設定され、これによりスレッドの作成側は、クラスおよびリソースのロード時にスレッドで実行中のコードに(getContextClassLoader
経由で)適切なクラス・ローダーを提供できるようになります。セキュリティ・マネージャが存在する場合、その
checkPermission
メソッドがRuntimePermission
("setContextClassLoader")
アクセス権で呼び出され、コンテキストClassLoaderの設定が許可されるか確認されます。- パラメータ:
cl
- このThreadのコンテキストClassLoader、またはシステム・クラス・ローダーを示す(またはブートストラップ・クラス・ローダーの失敗を示す) null- 例外:
SecurityException
- 現在のスレッドがコンテキストClassLoaderを設定できない場合- 導入されたバージョン:
- 1.2
-
holdsLock
public static boolean holdsLock(Object obj)現行スレッドが指定されたオブジェクトに対するモニター・ロックを保持する場合にのみ、true
を返します。このメソッドは、次のように、プログラムが、現行スレッドが指定されたロックをすでに保持していることを示す際に使用されます。
assert Thread.holdsLock(obj);
- パラメータ:
obj
- 所有権のロックをテストするオブジェクト- 戻り値:
- 現行スレッドが指定されたオブジェクトに対するモニター・ロックを保持する場合、
true
が返される。 - 例外:
NullPointerException
- objがnull
の場合- 導入されたバージョン:
- 1.4
-
getStackTrace
public StackTraceElement[] getStackTrace()このスレッドのスタック・ダンプを表すスタック・トレース要素の配列を返します。 このスレッドが開始されていないか、開始済みだがまだシステムによって実行対象としてスケジュールされていないか、あるいは終了済みの場合、このメソッドから長さゼロの配列が返されます。 返された配列がゼロ以外の長さの配列である場合、配列の最初の要素はスタックの最上部を表します。これはシーケンスで呼び出されたもっとも新しいメソッドです。 配列の最後の要素は、スタックの底部を表します。これはシーケンスで呼び出されたもっとも古いメソッドです。これはシーケンスで呼び出されたもっとも古いメソッドです。セキュリティ・マネージャが存在し、このスレッドが現在のスレッドではない場合、スタック・トレースを取得してよいかどうかを調べるために、
RuntimePermission("getStackTrace")
アクセス権を使ってセキュリティ・マネージャのcheckPermission
メソッドが呼び出されます。仮想マシンの中には、特定の状況下でスタック・トレースから1つ以上のスタック・フレームを省略するものがあります。 極端な場合、このスレッドに関するスタック・トレース情報を持たない仮想マシンが、このメソッドから長さゼロの配列を返すことが許可されます。
- 戻り値:
- 1つのスタック・フレームを表す
StackTraceElement
の配列。 - 例外:
SecurityException
- セキュリティ・マネージャが存在し、そのcheckPermission
メソッドがスレッドのスタック・トレースの取得を許可しない場合。- 導入されたバージョン:
- 1.5
- 関連項目:
SecurityManager.checkPermission(java.security.Permission)
、RuntimePermission
,Throwable.getStackTrace()
-
getAllStackTraces
public static Map<Thread,StackTraceElement[]> getAllStackTraces()すべてのライブ・スレッドのスタック・トレース・マップを返します。 マップ・キーはスレッドです。また、各マップの値は対応するThread
のスタック・ダンプを表すStackTraceElement
の配列です。 返されるスタック・トレースのフォーマットは、getStackTrace
メソッドで指定されたものとなります。このメソッドが呼び出されている間に、スレッドが実行されている可能性があります。 各スレッドのスタック・トレースは、スナップショットを表すだけです。各スタック・トレースは異なる時期に取得できます。 仮想マシンがスレッドに関するスタック・トレース情報を持たない場合、マップ値に長さゼロの配列が返されます。
セキュリティ・マネージャが存在し、このスレッドが現在のスレッドではない場合、すべてのスレッドのスタック・トレースを取得してよいかどうかを調べるために、
RuntimePermission("getStackTrace")
アクセス権とRuntimePermission("modifyThreadGroup")
アクセス権を使ってセキュリティ・マネージャのcheckPermission
メソッドが呼び出されます。- 戻り値:
Thread
から、対応するスレッドのスタック・トレースを表すStackTraceElement
の配列へのMap
。- 例外:
SecurityException
- セキュリティ・マネージャが存在し、そのcheckPermission
メソッドがスレッドのスタック・トレースの取得を許可しない場合。- 導入されたバージョン:
- 1.5
- 関連項目:
getStackTrace()
,SecurityManager.checkPermission(java.security.Permission)
,RuntimePermission
,Throwable.getStackTrace()
-
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
の場合、デフォルトのハンドラはない。- 例外:
SecurityException
- セキュリティ・マネージャが存在し、RuntimePermission
("setDefaultUncaughtExceptionHandler")
を拒否した場合- 導入されたバージョン:
- 1.5
- 関連項目:
setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
,getUncaughtExceptionHandler()
,ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
-
getDefaultUncaughtExceptionHandler
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()キャッチされない例外によりスレッドが突然終了したときに呼び出されるデフォルトのハンドラを返します。 戻り値がnull
の場合、デフォルトのハンドラはありません。- 戻り値:
- すべてのスレッド用のデフォルトのキャッチされない例外ハンドラ
- 導入されたバージョン:
- 1.5
- 関連項目:
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
-
getUncaughtExceptionHandler
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()キャッチされない例外によりスレッドが突然終了したときに呼び出されるハンドラを返します。 このスレッドが明示的に設定されたキャッチされない例外ハンドラを持たない場合、スレッドが終了しないかぎり、スレッドのThreadGroup
オブジェクトが返されます。この場合、null
が返されます。- 戻り値:
- このスレッド用のキャッチされない例外ハンドラ
- 導入されたバージョン:
- 1.5
-
setUncaughtExceptionHandler
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)キャッチされない例外により、突然スレッドが終了したときに使用されるハンドラを設定します。キャッチされない例外ハンドラを明示的に設定することで、スレッドはキャッチされない例外を完全に制御できます。 このようなハンドラが設定されていない場合は、スレッドの
ThreadGroup
オブジェクトがハンドラとして機能します。- パラメータ:
eh
- スレッドのキャッチされない例外ハンドラとして使用されるオブジェクト。null
の場合、スレッドは明示的なハンドラを持たない。- 例外:
SecurityException
- 現在のスレッドがこのスレッドの変更を許されていない場合。- 導入されたバージョン:
- 1.5
- 関連項目:
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
,ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
-