public class Thread extends Object implements Runnable
各スレッドには優先順位が付けられています。優先順位の高いスレッドは、優先順位の低いスレッドよりも優先して実行されます。さらに、各スレッドがデーモンとしてマークされている場合もあれば、されていない場合もあります。あるスレッドで実行中のコードが新しい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
がスローされます。
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 を名前として保持するようにします。また、group によって参照されるスレッド・グループに所属し、指定されたスタック・サイズを保持します。 |
Thread(ThreadGroup group, String name)
新しい
Thread オブジェクトを割り当てます。 |
修飾子と型 | メソッドと説明 |
---|---|
static int |
activeCount()
現在のスレッドのスレッド・グループとそのサブグループに含まれるアクティブ・スレッドの推定数を返します。
|
void |
checkAccess()
現在実行中のスレッドが、このスレッドを変更するためのアクセス権を持っているかどうかを判定します。
|
protected Object |
clone()
Threadを意味のあるかたちで複製することは不可能なため、CloneNotSupportedExceptionをスローします。
|
int |
countStackFrames()
非推奨。
この呼出しの定義は、非推奨の
suspend() に依存します。また、この呼出しの結果は保証されません。 |
static Thread |
currentThread()
現在実行中のスレッド・オブジェクトの参照を返します。
|
void |
destroy()
非推奨。
このメソッドはもともとクリーンアップなしでこのスレッドを破棄するように設計されていました。保持されるモニターはロックされた状態を維持します。ただし、このメソッドは実装されませんでした。実装されていたら、
suspend() とほぼ同じようにデッドロックが発生します。ターゲット・スレッドが重要なシステム・リソースを保護するロックを保持した状態で破棄された場合、どのスレッドも再びこのリソースにアクセスできません。別のスレッドがこのリソースをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。 |
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が推奨されない理由」を参照してください。 |
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()
このスレッドの実行を開始します。Java仮想マシンは、このスレッドの
run メソッドを呼び出します。 |
void |
stop()
非推奨。
このメソッドは本質的に安全ではありません。Thread.stopを使ってスレッドを停止すると、チェックされない
ThreadDeath 例外がスタックの下から上に伝えられた結果、そのスレッドによりロックされていたモニターのロックがすべて解除されます。これらのモニターによって以前保護されていたオブジェクトが整合性のない状態にあった場合、壊れたオブジェクトはほかのスレッドに対して可視になり、動作が保証されないことがあります。多くの場合、ターゲット・スレッドの実行停止を指示するには、stop ではなく、単に一部の変数を変更するコードを使用する必要があります。ターゲット・スレッドは、この変数を定期的に検査し、実行を停止するべきことを変数が示している場合には、スレッドのrunメソッドから通常の方法で復帰する必要があります。条件変数などでターゲット・スレッドが長い間待機している場合、待機を中断させるには、interrupt メソッドを使用します。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。 |
void |
stop(Throwable obj)
非推奨。
このメソッドは当初、スレッドを強制的に停止し、指定された
Throwable を例外としてスローするように設計されました。本質的に安全でなく(詳細はstop() を参照)、さらにターゲット・スレッドで処理の準備ができていない例外の生成に使用される可能性がありました。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。 |
void |
suspend()
非推奨。
このメソッドはデッドロックを発生しやすいため非推奨です。ターゲット・スレッドが、中断される時点で、重要なシステム・リソースを保護するモニターをロックしている場合、ターゲット・スレッドが再開されるまでどのスレッドもそのリソースにアクセスできません。このとき、ターゲット・スレッドを再開するスレッドが、
resume を呼び出す前にこのモニターをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。 |
String |
toString()
スレッドの名前、優先順位、スレッド・グループを含むこのスレッドの文字列表現を返します。
|
static void |
yield()
現在のスレッドが現在のプロセッサ使用量を譲る用意があることを示す、スケジューラへのヒントです。
|
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の形式を取ります。public Thread(Runnable target)
Thread
オブジェクトを割り当てます。このコンストラクタは、Thread (null, target, gname)
(gname
は新たに生成される名前)と同じ効果を持ちます。自動的に作成される名前は、nを整数とすると"Thread-"+
nの形式を取ります。target
- このスレッドの起動時に呼び出されるrun
メソッドを含むオブジェクト。null
の場合、このクラスのrun
メソッドは何も行わない。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
- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合public Thread(String name)
name
- 新しいスレッドの名前public Thread(ThreadGroup group, String name)
group
- スレッド・グループ。null
であり、かつセキュリティ・マネージャが存在する場合、SecurityManager.getThreadGroup()によってグループが決定されます。セキュリティ・マネージャが存在しない場合やSecurityManager.getThreadGroup()
からnull
が返される場合、グループは現在のスレッドのスレッド・グループに設定されます。name
- 新しいスレッドの名前SecurityException
- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合public Thread(Runnable target, String name)
target
- このスレッドの起動時に呼び出されるrun
メソッドを含むオブジェクト。null
の場合、このスレッドのrunメソッドが呼び出されます。name
- 新しいスレッドの名前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
- 現在のスレッドが、指定されたスレッド・グループ内にスレッドを作成できない、またはコンテキスト・クラス・ローダーのメソッドをオーバーライドできない場合。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
- 現在のスレッドが、指定されたスレッド・グループ内のスレッドを作成できない場合public static Thread currentThread()
public static void yield()
譲位は、通常であればCPUを過剰に使用してしまうスレッド間で相対的な進行状況を改善しようとするヒューリスティックな試みです。その使用時には詳細なプロファイルやベンチマークも組み合わせることで、目的の効果が実際に得られていることを確認すべきです。
このメソッドを使用する機会はまれにしかありません。これは、デバッグ目的やテスト目的で役立つ可能性があります(競合状態によるバグを再現するのに役立つ可能性がある)。これは、並行制御の構成要素(java.util.concurrent.locks
パッケージ内の構成要素など)を設計する際にも役立つ可能性があります。
public static void sleep(long millis) throws InterruptedException
millis
- ミリ秒単位のスリープ時間の長さIllegalArgumentException
- millis
の値が負の場合InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。public static void sleep(long millis, int nanos) throws InterruptedException
millis
- ミリ秒単位のスリープ時間の長さnanos
- 0-999999
追加でスリープするナノ秒IllegalArgumentException
- millis
の値が負の場合、またはnanos
の値が範囲0-999999
に含まれない場合InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。protected Object clone() throws CloneNotSupportedException
clone
、クラス: Object
CloneNotSupportedException
- 常時Cloneable
public void start()
run
メソッドを呼び出します。
その結果、(start
メソッドへの呼び出しから復帰する)現在のスレッドと(そのrun
メソッドを実行する)別のスレッドという2つのスレッドが並列に実行されます。
スレッドを複数回起動するのは、決して正しいとは言えません。特に、スレッドは実行を終えてから再起動することはできません。
IllegalThreadStateException
- スレッドがすでに起動していた場合。run()
, stop()
public void run()
Runnable
実行オブジェクトを使用して作成された場合、そのRunnable
オブジェクトのrun
メソッドが呼び出されます。それ以外の場合、このメソッドは何も行わずに復帰します。
Thread
のサブクラスは、このメソッドをオーバーライドしなければなりません。
run
、インタフェース: Runnable
start()
, stop()
, Thread(ThreadGroup, Runnable, String)
@Deprecated public final void 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)
@Deprecated public final void stop(Throwable obj)
Throwable
を例外としてスローするように設計されました。本質的に安全でなく(詳細はstop()
を参照)、さらにターゲット・スレッドで処理の準備ができていない例外の生成に使用される可能性がありました。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。UnsupportedOperationException
をスローします。obj
- 無視されるpublic void interrupt()
現在のスレッドが自身への割り込み(常に許可される)を行うのでないかぎり、このスレッドのcheckAccess
メソッドが呼び出されますが、その際、SecurityException
がスローされる可能性があります。
Object
クラスのwait()
、wait(long)
、またはwait(long, int)
メソッドの呼出し、あるいはこのクラスのjoin()
、join(long)
、join(long, int)
、sleep(long)
、またはsleep(long, int)
メソッドの呼出しによってこのスレッドがブロックされている場合、その割込みステータスがクリアされ、InterruptedException
が受信されます。
InterruptibleChannel
に対するI/O操作でこのスレッドがブロックされる場合、チャネルは閉じられ、スレッドの割込みステータスが設定されます。また、スレッドは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が推奨されない理由」を参照してください。NoSuchMethodError
をスローします。NoSuchMethodError
- 常時public final boolean isAlive()
true
、そうでない場合はfalse
。@Deprecated public final void suspend()
resume
を呼び出す前にこのモニターをロックしようとすると、デッドロックが発生します。通常、このようなデッドロックは、プロセスの「凍結」により明らかになります。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。
まず、このスレッドのcheckAccess
メソッドが、引数なしで呼び出されます。この結果、現在のスレッドでSecurityException
がスローされることがあります。
スレッドは、生存している場合に中断され、再開されない処理を先に進めることはできません。
SecurityException
- 現在のスレッドがこのスレッドを変更できない場合。checkAccess()
@Deprecated public final void resume()
suspend()
とともに使用するためにのみ存在しますが、これはデッドロックを発生させやすいため推奨されていません。詳細は、「Thread.stop、Thread.suspend、およびThread.resumeが推奨されない理由」を参照してください。
まず、このスレッドの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)
ThreadGroup.enumerate(Thread[])
メソッドを呼び出します。
アプリケーションでは、配列がどの程度の大きさになるかについておよその数を取得するためにactiveCountメソッドを使用する場合があります。ただし、配列が小さすぎてすべてのスレッドを保持できない場合、余分なスレッドは通知なしに無視されます。現在のスレッドのスレッド・グループとそのサブグループにあるすべてのアクティブ・スレッドを取得することが重要な場合、呼出し側は返された整数値が厳密にtarray
の長さ未満であることを確認する必要があります。
このメソッドの本質的な競合条件のため、このメソッドはデバッグおよび監視目的にのみ使用することをお薦めします。
tarray
- スレッドのリストの格納先である配列SecurityException
- 現在のスレッドがそのスレッド・グループにアクセスできないとThreadGroup.checkAccess()
によって判定された場合@Deprecated public int countStackFrames()
suspend()
に依存します。また、この呼出しの結果は保証されません。IllegalThreadStateException
- このスレッドが中断されていない場合。public final void join(long millis) throws InterruptedException
millis
ミリ秒待機します。0
のタイム・アウトは無期限に待機することを意味します。
この実装では、this.isAlive
が条件として与えられたthis.wait
呼出しのループを使用します。スレッドが終了すると、this.notifyAll
メソッドが呼び出されます。アプリケーションでは、Thread
インスタンスのwait
、notify
、またはnotifyAll
を使用しないことをお薦めします。
millis
- ミリ秒単位の待機時間IllegalArgumentException
- millis
の値が負の場合InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。public final void join(long millis, int nanos) throws InterruptedException
millis
ミリ秒にnanos
ナノ秒を加算した間、このスレッドが終了するのを待機します。
この実装では、this.isAlive
が条件として与えられたthis.wait
呼出しのループを使用します。スレッドが終了すると、this.notifyAll
メソッドが呼び出されます。アプリケーションでは、Thread
インスタンスのwait
、notify
、またはnotifyAll
を使用しないことをお薦めします。
millis
- ミリ秒単位の待機時間nanos
- 0-999999
追加で待機するナノ秒IllegalArgumentException
- millis
の値が負の場合、またはnanos
の値が範囲0-999999
に含まれない場合InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。public final void join() throws InterruptedException
このメソッド呼出しの動作は、次の呼出しの動作とまったく同一です。
join(0)
InterruptedException
- 何らかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。public static void dumpStack()
public final void setDaemon(boolean on)
このメソッドは、スレッド起動前に呼び出す必要があります。
on
- true
の場合、このスレッドをデーモン・スレッドとしてマークするIllegalThreadStateException
- このスレッドが生存している場合SecurityException
- 現在のスレッドがこのスレッドを変更できない場合とcheckAccess()
によって判定された場合public final boolean isDaemon()
true
、そうでない場合はfalse
。setDaemon(boolean)
public final void checkAccess()
セキュリティ・マネージャが存在する場合は、checkAccess
メソッドがこのスレッドをその引数に指定して呼び出されます。その結果、SecurityException
がスローされることがあります。
SecurityException
- 現在のスレッドがこのスレッドへのアクセスを許されていない場合。SecurityManager.checkAccess(Thread)
public String toString()
public ClassLoader getContextClassLoader()
セキュリティ・マネージャが存在し、呼出し元のクラス・ローダーがnull
でなく、かつコンテキスト・クラス・ローダーと同じでもその上位クラスでもない場合、このメソッドは、セキュリティ・マネージャのcheckPermission
メソッドをRuntimePermission
("getClassLoader")
アクセス権で呼び出し、コンテキスト・クラス・ローダーの取得が許可されるか確認します。
null
SecurityException
- 現在のスレッドがコンテキストClassLoaderを取得できない場合public void setContextClassLoader(ClassLoader cl)
getContextClassLoader
経由で)適切なクラス・ローダーを提供できるようになります。
セキュリティ・マネージャが存在する場合、そのcheckPermission
メソッドがRuntimePermission
("setContextClassLoader")
アクセス権で呼び出され、コンテキストClassLoaderの設定が許可されるか確認されます。
cl
- このThreadのコンテキストClassLoader、またはシステム・クラス・ローダーを示す(またはブートストラップ・クラス・ローダーの失敗を示す) nullSecurityException
- 現在のスレッドがコンテキストClassLoaderを設定できない場合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)
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.