java.lang类Thread
java.lang.Thread
所有已实现的接口:
public class
Thread
extends
Object
implements
Runnable
线程是程序中的执行线程。Java虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新Thread对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当Java虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的main方法)。Java虚拟机会继续执行线程,直到下列任一情况出现时为止:
调用了Runtime类的exit方法,并且安全管理器允许退出操作发生。
非守护线程的所有线程都已停止运行,无论是通过从对run方法的调用中返回,还是通过抛出一个传播到run方法之外的异常。
创建新执行线程有两种方法。一种方法是将类声明为Thread的子类。该子类应重写Thread类的run
方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
classPrimeThread extends Thread {
longminPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
publicvoid run() {
//compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeThread p= new PrimeThread(143);
p.start();
创建线程的另一种方法是声明实现Runnable接口的类。该类然后实现run方法。然后可以分配该类的实例,在创建Thread时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
class PrimeRunimplements Runnable {
longminPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
publicvoid run() {
//compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeRun p =new PrimeRun(143);
newThread(p).start();
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
从以下版本开始:
JDK1.0
另请参见:
嵌套类摘要
static class
static interface
当Thread
因未捕获的异常而突然终止时,调用处理程序的接口。
字段摘要
static int
线程可以具有的最高优先级。
static int
线程可以具有的最低优先级。
static int
构造方法摘要
()分配新的Thread对象。
(Runnable
target)分配新的Thread对象。
分配新的Thread对象。
(String
name)分配新的Thread对象。
分配新的Thread对象。
分配新的Thread对象,以便将target作为其运行对象,将指定的name作为其名称,并作为group所引用的线程组的一员。
(ThreadGroup
group, Runnable target,
String name, long stackSize)分配新的Thread对象,以便将target作为其运行对象,将指定的name作为其名称,作为group所引用的线程组的一员,并具有指定的堆栈大小。
分配新的Thread对象。
方法摘要
static int
()返回当前线程的线程组中活动线程的数目。
void
()判定当前运行的线程是否有权修改该线程。
int
()已过时。该调用的定义依赖于
static
Thread
()返回对当前正在执行的线程对象的引用。
void
()已过时。该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,它也极有可能以 “冻结”的进程。有关更多信息,请参阅
static void
()将当前线程的堆栈跟踪打印至标准错误流。
static int
(Thread[]
tarray)将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。
long
()返回该线程的标识符。
int
()返回线程的优先级。
static boolean
当且仅当当前线程在指定的对象上保持监视器锁时,才返回true。
void
static boolean
()测试当前线程是否已经中断。
boolean
()测试线程是否处于活动状态。
boolean
()测试该线程是否为守护线程。
boolean
()测试线程是否已经中断。
void
()等待该线程终止。
void
(long
millis)等待该线程终止的时间最长为millis毫秒。
void
(long
millis, int nanos)等待该线程终止的时间最长为millis毫秒+ nanos纳秒。
void
()如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。
void
(boolean
on)将该线程标记为守护线程或用户线程。
void
(String
name)改变线程名称,使之与参数name相同。
void
(int
newPriority)更改线程的优先级。
static void
(long
millis)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static void
(long
millis, int nanos)在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
void
()使该线程开始执行;Java虚拟机调用该线程的run方法。
void
()已过时。该方法具有固有的不安全性。用Thread.stop来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查ThreadDeath异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用interrupt方法来中断该等待。有关更多信息,请参阅
void
已过时。该方法具有固有的不安全性。有关详细信息,请参阅
void
()已过时。该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用resume之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅
()返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
static void
()暂停当前正在执行的线程对象,并执行其他线程。
字段详细信息
MIN_PRIORITY
public static final int
MIN_PRIORITY
线程可以具有的最低优先级。
另请参见:
NORM_PRIORITY
public static final int
NORM_PRIORITY
分配给线程的默认优先级。
另请参见:
MAX_PRIORITY
public static final int
MAX_PRIORITY
线程可以具有的最高优先级。
另请参见:
构造方法详细信息
Thread
public
Thread()
分配新的Thread
对象。这种构造方法与Thread(null, null, gname)具有相同的作用,其中
gname
是一个新生成的名称。自动生成的名称的形式为"Thread-"+n,其中的 n为整数。
另请参见:
Thread
public
Thread(Runnable target)
分配新的Thread
对象。这种构造方法与Thread(null, target,gname)具有相同的作用,其中的
gname是一个新生成的名称。自动生成的名称的形式为“Thread-”+n,其中的
n为整数。
参数:
target -其run方法被调用的对象。
另请参见:
Thread
public
Thread(ThreadGroup group,
分配新的Thread
对象。这种构造方法与Thread(group, target, gname)具有相同的作用,其中的
gname是一个新生成的名称。自动生成的名称的形式为"Thread-"+n,其中的 n为整数。
参数:
group -线程组。
target -其run方法被调用的对象。
抛出:
如果当前线程无法在指定的线程组中创建线程。
另请参见:
Thread
public
Thread(String name)
分配新的Thread
对象。这种构造方法与Thread(null, null, name)具有相同的作用。
参数:
name -新线程的名称。
另请参见:
Thread
public
Thread(ThreadGroup group,
分配新的Thread
对象。这种构造方法与Thread(group, null, name)具有相同的作用。
参数:
group -线程组。
name -新线程的名称。
抛出:
如果当前线程无法在指定的线程组中创建线程。
另请参见:
Thread
public
Thread(Runnable target,
分配新的Thread
对象。这种构造方法与Thread(null, target, name)具有相同的作用。
参数:
target -其run方法被调用的对象。
name -新线程的名称。
另请参见:
Thread
public
Thread(ThreadGroup group,
分配新的Thread
对象,以便将target作为其运行对象,将指定的name
作为其名称,并作为group所引用的线程组的一员。
如果group为null,并且有安全管理器,则该组由安全管理器的getThreadGroup方法确定。如果group为null,并且没有安全管理器,或安全管理器的getThreadGroup方法返回null,则该组与创建新线程的线程被设定为相同的ThreadGroup。
如果有安全管理器,则其checkAccess方法通过ThreadGroup作为其参数被调用。
此外,当被重写getContextClassLoader或setContextClassLoader方法的子类构造方法直接或间接调用时,其checkPermission方法通过RuntimePermission("enableContextClassLoaderOverride")权限调用。其结果可能是SecurityException。
如果target
参数不是null,则target的run方法在启动该线程时调用。如果target参数为null,则该线程的run方法在该线程启动时调用。
新创建线程的优先级被设定为创建该线程的线程的优先级,即当前正在运行的线程的优先级。方法setPriority可用于将优先级更改为一个新值。
当且仅当创建新线程的线程当前被标记为守护线程时,新创建的线程才被标记为守护线程。方法setDaemon可用于改变线程是否为守护线程。
参数:
group -线程组。
target -其run方法被调用的对象。
name -新线程的名称。
抛出:
如果当前线程无法在指定的线程组中创建线程,或者无法重写上下文类加载器方法。
另请参见:
Thread
public
Thread(ThreadGroup group,
longstackSize)
分配新的Thread
对象,以便将target作为其运行对象,将指定的name
作为其名称,作为group所引用的线程组的一员,并具有指定的堆栈大小。
除了允许指定线程堆栈大小以外,这种构造方法与 stackSize参数(如果有)的作用具有高度的平台依赖性。
在某些平台上,指定一个较高的stackSize参数值可能使线程在抛出 stackSize参数的值与最大递归深度和并发程度之间的关系细节与平台有关。在某些平台上,stackSize参数的值无论如何不会起任何作用。
作为建议,可以让虚拟机自由处理stackSize参数。如果指定值对于平台来说过低,则虚拟机可能使用某些特定于平台的最小值;如果指定值过高,则虚拟机可能使用某些特定于平台的最大值。同样,虚拟机还会视情况自由地舍入指定值(或完全忽略它)。
将stackSize
参数值指定为零将使这种构造方法与Thread(ThreadGroup, Runnable, String)构造方法具有完全相同的作用。
由于这种构造方法的行为具有平台依赖性,因此在使用它时要非常小心。执行特定计算所必需的线程堆栈大小可能会因JRE实现的不同而不同。鉴于这种不同,仔细调整堆栈大小参数可能是必需的,而且可能要在支持应用程序运行的JRE
实现上反复调整。
实现注意事项:鼓励Java
平台实现者文档化其stackSize parameter的实现行为。
参数:
group -线程组。
target -其run方法被调用的对象。
name -新线程的名称。
stackSize -新线程的预期堆栈大小,为零时表示忽略该参数。
抛出:
如果当前线程无法在指定的线程组中创建线程。
从以下版本开始:
1.4
方法详细信息
currentThread
public static
Thread currentThread()
返回对当前正在执行的线程对象的引用。
返回:
当前执行的线程。
yield
public static void
yield()
暂停当前正在执行的线程对象,并执行其他线程。
sleep
public static void
sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
参数:
millis -以毫秒为单位的休眠时间。
抛出:
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
另请参见:
sleep
public static void
sleep(long millis,
int nanos)
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
参数:
millis -以毫秒为单位的休眠时间。
nanos -要休眠的另外0-999999纳秒。
抛出:
如果millis
值为负或nanos值不在0-999999范围内。
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
另请参见:
start
public void
start()
使该线程开始执行;Java
虚拟机调用该线程的run方法。
结果是两个线程并发地运行;当前线程(从调用返回给start方法)和另一个线程(执行其run方法)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
抛出:
另请参见:
run
public void
run()
如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。
Thread的子类应该重写该方法。
指定者:
另请参见:
stop
public final void
stop()
已过时。该方法具有固有的不安全性。用Thread.stop来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查ThreadDeath异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用interrupt方法来中断该等待。有关更多信息,请参阅
强迫线程停止执行。
如果安装了安全管理器,则以this作为其参数调用checkAccess方法。这可能引发 SecurityException(在当前线程中)。
如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),则安全管理器的checkPermission方法(带有RuntimePermission("stopThread")参数)也会被调用。这会再次抛出SecurityException(在当前线程中)。
无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出一个新创建的ThreadDeath对象,作为异常。
停止一个尚未启动的线程是允许的。如果最后启动了该线程,它会立即终止。
应用程序通常不应试图捕获ThreadDeath,除非它必须执行某些异常的清除操作(注意,抛出ThreadDeath将导致try语句的finally子句在线程正式终止前执行)。如果catch子句捕获了一个ThreadDeath对象,则重新抛出该对象很重要,因为这样该线程才会真正终止。
对其他未捕获的异常作出反应的顶级错误处理程序不会打印输出消息,或者另外通知应用程序未捕获到的异常是否为ThreadDeath的一个实例。
抛出:
另请参见:
stop
public final void
stop(Throwable obj)
已过时。该方法具有固有的不安全性。有关详细信息,请参阅
强迫线程停止执行。
如果安装了安全管理器,则调用该线程的checkAccess方法,这可能引发SecurityException(在当前线程中)。
如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),或者obj不是ThreadDeath的一个实例,则安全管理器的checkPermission方法(带有RuntimePermission("stopThread")参数)也会被调用。此外,这可能抛出SecurityException(在当前线程中)。
如果参数obj为null,则抛出NullPointerException(在当前线程中)。
无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出Throwable对象obj,作为一个异常。这是一种不正常的操作,通常情况下,应使用不带任何参数的stop方法。
停止一个尚未启动的线程是允许的。如果最后启动了该线程,它会立即终止。
参数:
obj -要抛出的可抛出对象。
抛出:
另请参见:
interrupt
public void
interrupt()
中断线程。
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的
如果该线程在I/O操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个
如果该线程在一个
如果以前的条件都没有保存,则该线程的中断状态将被设置。
中断一个不处于活动状态的线程不需要任何作用。
抛出:
interrupted
public static boolean
interrupted()
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回false的方法反映出来。
返回:
如果当前线程已经中断,则返回true;否则返回false。
另请参见:
isInterrupted
public boolean
isInterrupted()
测试线程是否已经中断。线程的中断状态 不受该方法的影响。
线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回false的方法反映出来。
返回:
如果该线程已经中断,则返回true;否则返回false。
另请参见:
destroy
public void
destroy()
已过时。该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,它也极有可能以 “冻结”的进程。有关更多信息,请参阅
抛出:
isAlive
public final boolean
isAlive()
测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。
返回:
如果该线程处于活动状态,则返回true;否则返回false。
suspend
public final void
suspend()
已过时。该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用resume之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅
挂起线程。
首先,调用线程的checkAccess方法,且不带任何参数。这可能抛出SecurityException(在当前线程中)。
如果线程处于活动状态则被挂起,且不再有进一步的活动,除非重新开始。
抛出:
另请参见:
resume
public final void
resume()
重新开始挂起的进程。
首先,调用线程的checkAccess方法,且不带任何参数。这可能抛出SecurityException(在当前线程中)。
如果线程处于活动状态但被挂起,则它会在执行过程中重新开始并允许继续活动。
抛出:
另请参见:
setPriority
public final void
setPriority(int newPriority)
更改线程的优先级。
首先调用线程的checkAccess方法,且不带任何参数。这可能抛出SecurityException。
在其他情况下,线程优先级被设定为指定的newPriority和该线程的线程组的最大允许优先级相比较小的一个。
参数:
newPriority -要为线程设定的优先级
抛出:
如果优先级不在MIN_PRIORITY到MAX_PRIORITY范围内。
另请参见:
getPriority
public final int
getPriority()
返回线程的优先级。
返回:
该线程的优先级。
另请参见:
setName
public final void
setName(String name)
改变线程名称,使之与参数name
相同。
首先调用线程的checkAccess方法,且不带任何参数。这可能抛出SecurityException。
参数:
name -该线程的新名称。
抛出:
另请参见:
getName
public final
String getName()
返回该线程的名称。
返回:
该线程的名称。
另请参见:
getThreadGroup
public final
ThreadGroup
getThreadGroup()
返回该线程所属的线程组。 如果该线程已经终止(停止运行),该方法则返回null。
返回:
该线程的线程组。
activeCount
public static int
activeCount()
返回当前线程的线程组中活动线程的数目。
返回:
当前线程的线程组中活动线程的数目。
enumerate
public static int
enumerate(Thread[] tarray)
将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。该方法只调用当前线程的线程组的enumerate方法,且带有数组参数。
首先,如果有安全管理器,则enumerate方法调用安全管理器的checkAccess方法,并将线程组作为其参数。这可能导致抛出SecurityException。
参数:
tarray -要复制到的线程对象数组
返回:
放入该数组的线程数
抛出:
如果安全管理器存在,并且其checkAccess方法不允许该操作。
另请参见:
countStackFrames
public int
countStackFrames()
已过时。该调用的定义依赖于
计算该线程中的堆栈帧数。线程必须挂起。
返回:
该线程中的堆栈帧数。
抛出:
join
public final void
join(long millis)
等待该线程终止的时间最长为millis毫秒。超时为0意味着要一直等下去。
参数:
millis -以毫秒为单位的等待时间。
抛出:
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
join
public final void
join(long millis,
int nanos)
等待该线程终止的时间最长为millis毫秒+ nanos纳秒。
参数:
millis -以毫秒为单位的等待时间。
nanos -要等待的0-999999附加纳秒。
抛出:
如果millis
值为负,则nanos的值不在0-999999范围内。
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
join
public final void
join()
等待该线程终止。
抛出:
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
dumpStack
public static void
dumpStack()
将当前线程的堆栈跟踪打印至标准错误流。该方法仅用于调试。
另请参见:
setDaemon
public final void
setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机退出。
该方法必须在启动线程前调用。
该方法首先调用该线程的checkAccess方法,且不带任何参数。这可能抛出SecurityException(在当前线程中)。
参数:
on -如果为true,则将该线程标记为守护线程。
抛出:
另请参见:
isDaemon
public final boolean
isDaemon()
测试该线程是否为守护线程。
返回:
如果该线程是守护线程,则返回true;否则返回false。
另请参见:
checkAccess
public final void
checkAccess()
判定当前运行的线程是否有权修改该线程。
如果有安全管理器,则调用其checkAccess方法,并将该线程作为其参数。这可能导致抛出SecurityException。
抛出:
另请参见:
toString
public
String toString()
返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
覆盖:
返回:
该线程的字符串表示形式。
getContextClassLoader
public
ClassLoader
getContextClassLoader()
返回该线程的上下文ClassLoader。上下文ClassLoader由线程创建者提供,供运行于该线程中的代码在加载类和资源时使用。如果未设定,则默认为父线程的ClassLoader上下文。原始线程的上下文ClassLoader通常设定为用于加载应用程序的类加载器。
首先,如果有安全管理器,并且调用者的类加载器不是null,也不同于其上下文类加载器正在被请求的线程上下文类加载器的祖先,则通过RuntimePermission("getClassLoader")权限调用该安全管理器的checkPermission方法,查看是否可以获取上下文ClassLoader。
返回:
该线程的上下文ClassLoader
从以下版本开始:
1.2
另请参见:
setContextClassLoader
public void
setContextClassLoader(ClassLoader cl)
设置该线程的上下文ClassLoader。上下文ClassLoader可以在创建线程设置,并允许创建者在加载类和资源时向该线程中运行的代码提供适当的类加载器。
首先,如果有安全管理器,则通过RuntimePermission("setContextClassLoader")权限调用其checkPermission方法,查看是否可以设置上下文ClassLoader。
参数:
cl -该线程的上下文ClassLoader
抛出:
如果当前线程无法设置上下文ClassLoader。
从以下版本开始:
1.2
另请参见:
holdsLock
public static boolean
holdsLock(Object obj)
当且仅当当前线程在指定的对象上保持监视器锁时,才返回true。
该方法旨在使程序能够断言当前线程已经保持一个指定的锁:
assertThread.holdsLock(obj);
参数:
obj -用于测试锁所属权的对象
返回:
如果当前线程在指定的对象上保持监视器锁,则返回true。
抛出:
从以下版本开始:
1.4
getStackTrace
public
StackTraceElement[]
getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。
如果有安全管理器,并且该线程不是当前线程,则通过RuntimePermission("getStackTrace")权限调用安全管理器的checkPermission方法,查看是否可以获取堆栈跟踪。
某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该线程堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。
返回:
StackTraceElement
数组,每个数组代表一个堆栈帧。
抛出:
如果安全管理器存在,并且其checkPermission方法不允许获取线程的堆栈跟踪。
从以下版本开始:
1.5
另请参见:
getAllStackTraces
public static
Map
getAllStackTraces()
返回所有活动线程的堆栈跟踪的一个映射。映射键是线程,而每个映射值都是一个StackTraceElement数组,该数组表示相应Thread的堆栈转储。返回的堆栈跟踪的格式都是针对
在调用该方法的同时,线程可能也在执行。每个线程的堆栈跟踪仅代表一个快照,并且每个堆栈跟踪都可以在不同时间获得。如果虚拟机没有线程的堆栈跟踪信息,则映射值中将返回一个零长度数组。
如果有安全管理器,则通过RuntimePermission("getStackTrace")权限和RuntimePermission("modifyThreadGroup")权限调用其checkPermission方法,查看是否可以获取所有线程的堆栈跟踪。
返回:
从Thread到StackTraceElement数组的一个Map,代表相应线程的堆栈跟踪。
抛出:
如果安全管理器存在,并且其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)
设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
未捕获到的异常处理首先由线程控制,然后由线程的 uncaughtException方法,则将调用默认处理程序的uncaughtException方法。
通过设置未捕获到的默认异常处理程序,应用程序可以为那些已经接受系统提供的任何“默认”行为的线程改变未捕获到的异常处理方式(如记录到某一特定设备或文件)。
请注意,未捕获到的默认异常处理程序通常不应顺从该线程的ThreadGroup对象,因为这可能导致无限递归。
参数:
eh -用作未捕获到的默认异常处理程序的对象。 如果为null,则没有默认处理程序。
抛出:
如果安全管理器存在并拒绝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,则该线程没有明确的处理程序。
抛出:
从以下版本开始:
1.5
另请参见: