Thread类
所在包:java.lang.Thread
- 所有已实现的接口:Runnable
- 已知直接子类:ForkJoinWorkerThread
public class Thread
extends Object
implements Runnable
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread
对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main
方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
- 调用了
Runtime
类的exit
方法,并且安全管理器允许退出操作发生。 - 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到
run
方法之外的异常。
创建新执行线程有两种方法。一种方法是将类声明为 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();
创建线程的另一种方法是声明实现 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
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
。
- 从以下版本开始:
- JDK1.0
- 另请参见:
Runnable
,Runtime.exit(int)
,run()
,stop()
嵌套类摘要 | |
---|---|
Modifier and Type | Class and Description |
static class |
Thread.State
线程状态。
|
static interface |
Thread.UncaughtExceptionHandler
当Thread由于未捕获的异常而突然终止时,处理程序的 接口被调用。
|
Field Summary字段汇总 | |
---|---|
Modifier and Type | Field and Description |
static int |
MAX_PRIORITY
线程可以拥有的最大优先级。
|
static int |
MIN_PRIORITY
线程可以拥有的最小优先级。
|
static int |
NORM_PRIORITY
分配给线程的默认优先级。
|
构造方法摘要 |
---|
Constructor and Description |
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)
分配一个新的
Thread 对象,使其具有 target 作为其运行对象,具有指定的 name 作为其名称,属于 group 引用的线程组。 |
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
分配一个新的
Thread 对象,以便它具有 target 作为其运行对象,将指定的 name 正如其名,以及属于该线程组由称作 group ,并具有指定的 堆栈大小 。 |
Thread(ThreadGroup group, String name)
分配一个新的
Thread 对象。 |
方法摘要 | |
---|---|
Modifier and Type | Method and Description |
static int |
activeCount()
返回当前线程的thread group及其子组中活动线程数的估计。
|
void |
checkAccess()
确定当前正在运行的线程是否有权限修改此线程。
|
protected Object |
clone()
将CloneNotSupportedException作为线程抛出无法有意义地克隆。
|
int |
countStackFrames()
已弃用
此呼叫的定义取决于
suspend() ,它已被弃用。 此外,此呼叫的结果从未明确。 |
static Thread |
currentThread()
返回对当前正在执行的线程对象的引用。
|
void |
destroy()
已弃用
这种方法最初是为了销毁这个线程而没有任何清理。 它所持有的任何监视器都将保持锁定。 但是,该方法从未实现。 如果要实施,那么它将是
suspend() 的方式是僵死的 。 如果目标线程在销毁时保护关键系统资源的锁,则无法再次访问该资源。 如果另一个线程曾尝试锁定此资源,将导致死锁。 这种僵局通常表现为“冻结”过程。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
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() 一起使用,因为它是死锁倾向的,因此已被弃用。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
void |
run()
如果这个线程使用单独的
Runnable 运行对象构造,则调用该Runnable 对象的run 方法; 否则,此方法不执行任何操作并返回。 |
void |
setContextClassLoader(ClassLoader cl)
设置此线程的上下文ClassLoader。
|
void |
setDaemon(boolean on)
将此线程标记为 daemon线程或用户线程。
|
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 ThreadDeath异常在堆栈中ThreadDeath 的自然结果)。 如果先前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象将变得对其他线程可见,可能导致任意行为。 stop 许多用途应该被替换为只是修改一些变量以指示目标线程应该停止运行的代码。 目标线程应该定期检查此变量,如果变量表示要停止运行,则以有序方式从其运行方法返回。 如果目标线程长时间等待(例如,在interrupt 变量上),则应该使用interrupt 方法来中断等待。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
void |
stop(Throwable obj)
已弃用
该方法最初设计为强制线程停止并抛出一个给定的
Throwable 作为例外。 它本质上是不安全的(有关详细信息,请参阅stop() ),此外还可用于生成目标线程未准备处理的异常。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
void |
suspend()
已弃用
这种方法已被弃用,因为它本身就是死锁的。 如果目标线程在挂起时保护关键系统资源的监视器上的锁定,则在目标线程恢复之前,线程不能访问该资源。 如果要恢复目标线程的线程在调用
resume 之前尝试锁定此监视器, resume 导致死锁。 这种僵局通常表现为“冻结”过程。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
String |
toString()
返回此线程的字符串表示,包括线程的名称,优先级和线程组。
|
static void |
yield()
对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
|
Methods inherited from class java.lang.Object (以下方法继承自 java.lang.Object类)
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
字段详细信息
-
MIN_PRIORITY
public static final int MIN_PRIORITY
线程可以拥有的最小优先级。- 另请参见:
- Constant Field Values
-
NORM_PRIORITY
public static final int NORM_PRIORITY
分配给线程的默认优先级。- 另请参见:
- Constant Field Values
-
NORM_PRIORITY
public static final int NORM_PRIORITY
分配给线程的默认优先级。- 另请参见:
- Constant Field Values
构造方法详细信息
-
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
方法的对象。 如果null
,这个类run
方法什么都不做。
-
Thread
public Thread(ThreadGroup group, Runnable target)
分配一个新的Thread
对象。 此构造具有相同的效果Thread(group, target, gname)
,其中gname
是新生成的名字。 自动生成的名称格式为"Thread-"+
n ,其中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
public Thread(Runnable target, String name)
分配一个新的Thread
对象。 此构造具有相同的效果Thread(null, target, name)
。- 参数
target
- 启动此线程时调用其run
方法的对象。 如果null
,则调用此线程的run方法。name
- 新线程的名称
-
Thread
public Thread(ThreadGroup group, Runnable target, String name)
分配一个新的Thread
对象,使其具有target
作为其运行对象,具有指定的name
作为其名称,属于group
引用的线程组。如果有安全管理器,则使用ThreadGroup作为参数调用其
checkAccess
方法。此外,它的
checkPermission
方法由RuntimePermission("enableContextClassLoaderOverride")
权限调用,直接或间接地由覆盖getContextClassLoader
或setContextClassLoader
方法的子类的getContextClassLoader
setContextClassLoader
调用。新创建的线程的优先级设置为等于创建线程的优先级,即当前正在运行的线程。 可以使用方法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
方法详细信息
-
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
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
-
clone
protected Object clone() throws CloneNotSupportedException
将CloneNotSupportedException作为线程抛出无法有意义地克隆。 构造一个新的线程。- 重写:
clone
在类别Object
- 结果
- 这个实例的一个克隆。
- 异常
CloneNotSupportedException
- 永远- 另请参见:
Cloneable
-
start
public void start()
导致此线程开始执行; Java虚拟机调用此线程的run
方法。结果是两个线程同时运行:当前线程(从调用返回到
start
方法)和另一个线程(执行其run
方法)。不止一次启动线程是不合法的。 特别地,一旦线程完成执行就可能不会重新启动。
- 异常
IllegalThreadStateException
- 如果线程已经启动。- 另请参见:
run()
,stop()
-
run
public void run()
如果这个线程是使用单独的Runnable
运行对象构造的,则Runnable
对象的run
方法; 否则,此方法不执行任何操作并返回。Thread的
Thread
应该覆盖此方法。- Specified by:
run
在界面Runnable
- 另请参见:
start()
,stop()
,Thread(ThreadGroup, Runnable, String)
-
stop
@Deprecated public final void stop()
已弃用 这种方法本质上是不安全的。 使用Thread.stop停止线程可以解锁所有已锁定的监视器(由于未ThreadDeath
ThreadDeath异常在堆栈中ThreadDeath
的自然结果)。 如果先前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象将变得对其他线程可见,可能导致任意行为。stop
许多用途应该被代替,只需修改一些变量来指示目标线程应该停止运行。 目标线程应该定期检查此变量,如果变量表示要停止运行,则以有序方式从其运行方法返回。 如果目标线程长时间等待(例如,在interrupt
变量上),则应该使用interrupt
方法来中断等待。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。强制线程停止执行。如果安装了一个安全管理器,它的
checkAccess
方法this
作为参数。 这可能导致SecurityException
被提升(在当前线程中)。如果此线程与当前线程不同(即当前线程正试图停止除本身线程之外的线程),则另外还调用安全管理器的
checkPermission
方法(具有RuntimePermission("stopThread")
参数)。 再次,这可能会导致抛出SecurityException
(在当前线程中)。由该线程表示的线程被强制停止,它正在异常进行,并抛出一个新创建的
ThreadDeath
对象作为例外。允许停止尚未启动的线程。 如果线程最终启动,它将立即终止。
一个应用程序通常不应该尝试捕获
ThreadDeath
,除非它必须做一些非凡的清理操作(请注意,抛出ThreadDeath
导致finally
语句try
语句在线程正式死亡之前执行)。 如果一个catch
子句捕获一个ThreadDeath
对象,重要的是重新抛出该对象,使线程实际上死亡。该反应否则捕获的异常不打印出消息,或者如果未捕获的异常是一个实例,否则通知应用程序的顶级错误处理程序
ThreadDeath
。
-
stop
@Deprecated public final void stop(Throwable obj)
已弃用 该方法最初设计为强制线程停止并抛出一个给定的Throwable
作为例外。 它本质上是不安全的(详见stop()
),此外还可用于生成目标线程未准备处理的异常。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。UnsupportedOperationException
。- 参数
obj
- 忽略
-
interrupt
public void interrupt()
中断这个线程。除非当前线程中断自身,这是始终允许的,所以调用此线程的
checkAccess
方法,这可能会导致抛出SecurityException
。如果该线程阻塞的调用
wait()
,wait(long)
,或wait(long, int)
的方法Object
类,或者在join()
,join(long)
,join(long, int)
,sleep(long)
,或sleep(long, int)
,这个类的方法,那么它的中断状态将被清除,并且将收到一个InterruptedException
。如果该线程在可阻止在I / O操作
InterruptibleChannel
则信道将被关闭,该线程的中断状态将被设置,并且螺纹将收到一个ClosedByInterruptException
。如果该线程在
Selector
中被阻塞,则线程的中断状态将被设置,并且它将从选择操作立即返回,可能具有非零值,就像调用了选择器的wakeup
方法一样。如果以前的条件都不成立,则该线程的中断状态将被设置。
中断不存在的线程不需要任何效果。
- 异常
SecurityException
- 如果当前线程不能修改此线程
-
interrupted
public static boolean interrupted()
测试当前线程是否中断。 该方法可以清除线程的中断状态 。 换句话说,如果这个方法被连续调用两次,那么第二个调用将返回false(除非当前线程再次中断,在第一个调用已经清除其中断状态之后,在第二个调用之前已经检查过)。忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
- 结果
true
如果当前线程已被中断;false
否则。- 另请参见:
isInterrupted()
-
isInterrupted
public boolean isInterrupted()
测试这个线程是否被中断。 线程的中断状态不受此方法的影响。忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
- 结果
true
如果这个线程已被中断;false
否则。- 另请参见:
interrupted()
-
destroy
@Deprecated public void destroy()
已弃用 这种方法最初是为了销毁这个线程而没有任何清理。 它所持有的任何监视器都将保持锁定。 但是,该方法从未实现。 如果要实施,那么suspend()
的方式会是僵死的 。 如果目标线程在销毁时保护关键系统资源的锁,则无法再次访问该资源。 如果另一个线程曾尝试锁定此资源,将导致死锁。 这种僵局通常表现为“冻结”过程。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。- 异常
NoSuchMethodError
- 永远
-
isAlive
public final boolean isAlive()
测试这个线程是否活着。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。- 结果
true
如果这个线程还活着;false
否则。
-
isAlive
public final boolean isAlive()
测试这个线程是否活着。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。- 结果
true
如果这个线程还活着;false
否则。
-
suspend
@Deprecated public final void suspend()
已弃用 这种方法已被弃用,因为它本身就是死锁的。 如果目标线程在挂起时保护关键系统资源的监视器上的锁定,则在目标线程恢复之前,线程不能访问该资源。 如果要恢复目标线程的线程在调用resume
之前尝试锁定此监视器,resume
导致死锁。 这种僵局通常表现为“冻结”过程。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。暂停这个线程。首先,这个线程的
checkAccess
方法被调用,没有参数。 这可能会导致SecurityException
(在当前线程中)。如果线程活着,它将被暂停,并且不会进一步进行,除非和直到恢复。
- 异常
SecurityException
- 如果当前线程不能修改此线程。- 另请参见:
checkAccess()
-
resume
@Deprecated public final void resume()
已弃用 此方法仅适用于suspend()
,由于它是死锁倾向,因此已被弃用。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。恢复挂起的线程。首先,这个线程的
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()
返回当前线程的thread group及其子组中活动线程数的估计。 递归地遍历当前线程的线程组中的所有子组。返回的值只是一个估计,因为线程数可能会在此方法遍历内部数据结构时动态更改,并且可能受某些系统线程的存在的影响。 此方法主要用于调试和监视。
- 结果
- 对当前线程的线程组和任何其他线程组中当前线程的线程组作为祖先的活动线程数的估计
-
enumerate
public static int enumerate(Thread[] tarray)
将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中。 该方法简单地调用当前线程的线程组的ThreadGroup.enumerate(Thread[])
方法。应用程序可能会使用activeCount方法来估计数组的大小,但是如果数组太短而不能容纳所有线程,则会忽略额外的线程。 如果在当前线程组及其子组中获取每个活动线程至关重要,则调用者应验证返回的int值是否严格小于
tarray
的长度。由于本方法中固有的竞争条件,建议该方法仅用于调试和监控。
- 参数
tarray
- 放置线程列表的数组- 结果
- 放入数组的线程数
- 异常
SecurityException
- 如果ThreadGroup.checkAccess()
确定当前线程无法访问其线程组
-
countStackFrames
@Deprecated public int countStackFrames()
已弃用 此调用的定义取决于suspend()
,它被废弃了。 此外,此呼叫的结果从未明确。计算此线程中的堆栈帧数。 线程必须暂停。- 结果
- 此线程中的堆栈帧数。
- 异常
IllegalThreadStateException
- 如果此线程未挂起。
-
join
public final void join(long millis) throws InterruptedException
等待这个线程死亡的时间最多为millis
毫秒。0
的超时意味着永远等待。此实现使用
this.wait
调用的循环,条件为this.isAlive
。 当线程终止时,调用this.notifyAll
方法。 建议应用程序不使用wait
,notify
,或notifyAll
上Thread
实例。- 参数
millis
- 以毫秒为单位等待的时间- 异常
IllegalArgumentException
- 如果millis
值为负InterruptedException
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
-
join
public final void join(long millis) throws InterruptedException
等待这个线程死亡的时间最多为millis
毫秒。0
的超时意味着永远等待。此实现使用
this.wait
调用的循环,条件为this.isAlive
。 当线程终止时,调用this.notifyAll
方法。 建议应用程序不使用wait
,notify
,或notifyAll
上Thread
实例。- 参数
millis
- 以毫秒为单位等待的时间- 异常
IllegalArgumentException
- 如果millis
值为负InterruptedException
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
-
join
public final void join() throws InterruptedException
等待这个线程死亡。调用此方法的行为方式与调用完全相同
- join
(0)
- 异常
InterruptedException
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
- join
-
dumpStack
public static void dumpStack()
将当前线程的堆栈跟踪打印到标准错误流。 此方法仅用于调试。
-
setDaemon
public final void setDaemon(boolean on)
将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。线程启动前必须调用此方法。
- 参数
on
- 如果true
,将此线程标记为守护线程- 异常
IllegalThreadStateException
- 如果这个线程是 aliveSecurityException
- 如果checkAccess()
确定当前线程不能修改此线程
-
isDaemon
public final boolean isDaemon()
测试这个线程是否是守护线程。- 结果
true
如果这个线程是一个守护线程;false
否则。- 另请参见:
setDaemon(boolean)
-
checkAccess
public final void checkAccess()
确定当前正在运行的线程是否有权限修改此线程。如果有一个安全管理器,它的
checkAccess
方法被调用这个线程作为它的参数。 这可能会导致投掷SecurityException
。- 异常
SecurityException
- 如果当前线程不允许访问此线程。- 另请参见:
SecurityManager.checkAccess(Thread)
-
getContextClassLoader
public ClassLoader getContextClassLoader()
返回此Thread的上下文ClassLoader。 上下文ClassLoader由线程的创建者提供,以便在加载类和资源时在此线程中运行的代码使用。 如果不是set ,默认是父线程的ClassLoader上下文。 原始线程的上下文ClassLoader通常设置为用于加载应用程序的类加载器。如果安全管理器存在,并且调用者的类加载器不是
null
,并且与上下文类加载器的祖先不一样或者祖先,则该方法调用安全管理器的checkPermission
方法,具有RuntimePermission
("getClassLoader")
权限,以验证是否检索上下文类加载器是允许的。- 结果
- 该线程的上下文ClassLoader,或
null
指示系统类加载器(或者失败的是引导类加载器) - 异常
SecurityException
- 如果当前线程无法获取上下文ClassLoader- 从以下版本开始:
- 1.2
-
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)
设置此线程的上下文ClassLoader。 当创建线程时,可以设置上下文ClassLoader,并允许线程的创建者通过getContextClassLoader
提供相应的类加载器,以便在加载类和资源时在线程中运行代码。如果存在安全管理员,则其
checkPermission
方法将被调用RuntimePermission
("setContextClassLoader")
权限,以查看是否允许设置上下文ClassLoader。- 参数
cl
- 此线程的上下文ClassLoader,或指示系统类加载器的空值(或者,失败的是引导类加载器)- 异常
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()
返回表示此线程的堆栈转储的堆栈跟踪元素数组。 该方法将返回一个零长度的数组,如果该线程尚未启动,已启动但尚未被计划运行,或已终止。 如果返回的数组非零长度,则数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。 数组的最后一个元素表示堆栈的底部,这是序列中最近最少的方法调用。如果有一个安全管理器,并且这个线程不是当前的线程,那么安全管理器的checkPermission方法被调用一个RuntimePermission("getStackTrace")权限来查看是否可以获取堆栈跟踪。
在某些情况下,某些虚拟机可能从堆栈跟踪中省略一个或多个堆栈帧。 在极端情况下,允许没有关于该线程的堆栈跟踪信息的虚拟机从该方法返回零长度数组。
- 结果
- 一个 StackTraceElement的数组,每个代表一个堆栈帧。
- 异常
SecurityException
- 如果安全管理器存在,并且其 checkPermission方法不允许获取线程的堆栈跟踪。- 从以下版本开始:
- 1.5
- 另请参见:
SecurityManager.checkPermission(java.security.Permission)
,RuntimePermission
,Throwable.getStackTrace()
-
getAllStackTraces
public static Map<Thread,StackTraceElement[]> getAllStackTraces()
返回所有活动线程的堆栈跟踪图。 地图键是线程,每个地图值是StackTraceElement数组,表示对应的Thread的堆栈转储。 返回的堆栈跟踪格式为getStackTrace
方法指定的格式。线程可能正在执行,而此方法被调用。 每个线程的堆栈跟踪仅表示快照,并且可以在不同时间获取每个堆栈跟踪。 如果虚拟机没有关于线程的堆栈跟踪信息,则将在地图值中返回零长度的数组。
如果有一个安全管理员,那么安全管理员的checkPermission方法被调用一个RuntimePermission("getStackTrace")权限以及RuntimePermission("modifyThreadGroup")权限来查看是否可以获取所有线程的堆栈跟踪。
- 结果
- 一个 Map从 Thread到一个 StackTraceElement的数组, 代表相应线程的堆栈跟踪。
- 异常
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)
-
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)
-
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)
-
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)