public class Thread
extends Object
implements Runnable
java.lang.Object | |
↳ | java.lang.Thread |
Known Direct Subclasses |
线程是程序中执行的线程。 Java虚拟机允许应用程序同时运行多个执行线程。
每个线程都有优先权。 执行优先级较高的线程优先于较低优先级的线程。 每个线程可能也可能不会被标记为守护进程。 当某个线程中运行的代码创建一个新的Thread
对象时,新线程的优先级初始设置等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护线程。
当Java虚拟机启动时,通常会有一个非守护进程线程(通常会调用某个指定类的名为main
的方法)。 Java虚拟机将继续执行线程,直到出现以下任一情况:
exit
method of class Runtime
has been called and the security manager has permitted the exit operation to take place. run
method or by throwing an exception that propagates beyond the run
method. 有两种方法可以创建一个新的执行线程。 一个是声明一个类是Thread
的子类。 这个子类应该重写run
类的方法Thread
。 然后可以分配和启动子类的一个实例。 例如,计算大于所述值的素数的线程可以写成如下:
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
时作为参数进行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
。
Nested classes |
|
---|---|
枚举 |
Thread.State 线程状态。 |
interface |
Thread.UncaughtExceptionHandler Thread由于未捕获的异常而突然终止时调用的处理程序接口。 |
Constants |
|
---|---|
int |
MAX_PRIORITY 线程可以拥有的最大优先级。 |
int |
MIN_PRIORITY 线程可以拥有的最低优先级。 |
int |
NORM_PRIORITY 分配给线程的默认优先级。 |
Public constructors |
|
---|---|
Thread() 分配一个新的 |
|
Thread(Runnable target) 分配一个新的 |
|
Thread(ThreadGroup group, Runnable target) 分配一个新的 |
|
Thread(String name) 分配一个新的 |
|
Thread(ThreadGroup group, String name) 分配一个新的 |
|
Thread(Runnable target, String name) 分配一个新的 |
|
Thread(ThreadGroup group, Runnable target, String name) 分配一个新的 |
|
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配一个新的 |
Public methods |
|
---|---|
static int |
activeCount() 返回当前线程 thread group及其子组中活动线程数的估计值。 |
final void |
checkAccess() 确定当前正在运行的线程是否有权修改此线程。 |
int |
countStackFrames() 此方法在API级别1中已被弃用。此调用的定义取决于 |
static Thread |
currentThread() 返回对当前正在执行的线程对象的引用。 |
void |
destroy() 此方法在API级别1中已弃用。此方法最初设计用于在不进行任何清理的情况下销毁此线程。 它保存的任何监视器都将保持锁定状态。 但是,该方法从未实现过。 如果如果要实施的话,那么将会以 |
static void |
dumpStack() 将当前线程的堆栈跟踪打印到标准错误流。 |
static int |
enumerate(Thread[] tarray) 将当前线程的线程组及其子线程组中的每个活动线程复制到指定的数组中。 |
static Map<Thread, StackTraceElement[]> |
getAllStackTraces() 返回所有活动线程的堆栈跟踪图。 |
ClassLoader |
getContextClassLoader() 返回此线程的上下文ClassLoader。 |
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler() 返回由于未捕获的异常而导致线程突然终止时调用的默认处理程序。 |
long |
getId() 返回此线程的标识符。 |
final String |
getName() 返回此线程的名称。 |
final int |
getPriority() 返回此线程的优先级。 |
StackTraceElement[] |
getStackTrace() 返回表示此线程的堆栈转储的堆栈跟踪元素的数组。 |
Thread.State |
getState() 返回此线程的状态。 |
final ThreadGroup |
getThreadGroup() 返回此线程所属的线程组。 |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() 返回由于未捕获的异常而导致此线程突然终止时调用的处理函数。 |
static boolean |
holdsLock(Object obj) 当且仅当当前线程持有指定对象上的监视器锁定时返回 true 。 |
void |
interrupt() 中断此线程。 |
static boolean |
interrupted() 测试当前线程是否被中断。 |
final boolean |
isAlive() 测试此线程是否存在。 |
final boolean |
isDaemon() 测试此线程是否为守护程序线程。 |
boolean |
isInterrupted() 测试该线程是否被中断。 |
final void |
join() 等待这个线程死亡。 |
final void |
join(long millis) 此线程死亡最多等待 |
final void |
join(long millis, int nanos) 最多等待 |
final void |
resume() 此方法在API级别1中已被弃用。此方法仅供与 |
void |
run() 如果此线程是使用单独的 |
void |
setContextClassLoader(ClassLoader cl) 为此线程设置上下文ClassLoader。 |
final void |
setDaemon(boolean on) 将此线程标记为 daemon线程或用户线程。 |
static void |
setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置当线程由于未捕获的异常而突然终止时调用的缺省处理程序,并且没有为该线程定义其他处理程序。 |
final void |
setName(String name) 将此线程的名称更改为等于参数 |
final void |
setPriority(int newPriority) 改变这个线程的优先级。 |
void |
setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置由于未捕获的异常而导致此线程突然终止时调用的处理函数。 |
static void |
sleep(long millis, int nanos) 使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数加上指定的纳秒数,这取决于系统定时器和调度程序的精度和准确性。 |
static void |
sleep(long millis) 使系统定时器和调度程序的精确性和准确性,使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数。 |
void |
start() 导致此线程开始执行; Java虚拟机调用此线程的 |
final void |
stop() 此方法在API级别1中已弃用。此方法本质上不安全。 使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(作为未检查的 |
final void |
stop(Throwable obj) 此方法在API级别1中已弃用。此方法本质上不安全。 详情请参阅 |
final void |
suspend() 此方法在API级别1中已被弃用。此方法已被弃用,因为它本质上容易出现死锁。 如果目标线程在监视器上保留一个锁定,以便在暂停时保护关键系统资源,则在目标线程恢复之前,线程无法访问此资源。 如果在调用 |
String |
toString() 返回此线程的字符串表示形式,包括线程的名称,优先级和线程组。 |
static void |
yield() 向调度程序提示当前线程愿意产生当前使用的处理器。 |
Protected methods |
|
---|---|
Object |
clone() 作为线程引发CloneNotSupportedException不能被有意克隆。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface java.lang.Runnable
|
Thread ()
分配新的Thread
对象。 此构造函数与Thread (null, null, gname)
具有相同的效果,其中gname
是新生成的名称。 自动生成的名称格式为"Thread-"+
n ,其中n是一个整数。
Thread (Runnable target)
分配一个新的Thread
对象。 此构造函数与Thread (null, target, gname)
具有相同的效果,其中gname
是新生成的名称。 自动生成的名称格式为"Thread-"+
n ,其中n是一个整数。
Parameters | |
---|---|
target |
Runnable : the object whose run method is invoked when this thread is started. If null , this classes run method does nothing. |
Thread (ThreadGroup group, Runnable target)
分配新的Thread
对象。 此构造函数与Thread (group, target, gname)
具有相同的效果,其中gname
是新生成的名称。 自动生成的名称格式为"Thread-"+
n ,其中n是一个整数。
Parameters | |
---|---|
group |
ThreadGroup : the thread group. If null and there is a security manager, the group is determined by SecurityManager.getThreadGroup(). If there is not a security manager or SecurityManager.getThreadGroup() returns null , the group is set to the current thread's thread group. |
target |
Runnable : the object whose run method is invoked when this thread is started. If null , this thread's run method is invoked. |
Throws | |
---|---|
SecurityException |
if the current thread cannot create a thread in the specified thread group |
Thread (String name)
分配一个新的Thread
对象。 此构造函数与Thread (null, null, name)
具有相同的效果。
Parameters | |
---|---|
name |
String : the name of the new thread |
Thread (ThreadGroup group, String name)
分配一个新的Thread
对象。 该构造函数与Thread (group, null, name)
具有相同的效果。
Parameters | |
---|---|
group |
ThreadGroup : the thread group. If null and there is a security manager, the group is determined by SecurityManager.getThreadGroup(). If there is not a security manager or SecurityManager.getThreadGroup() returns null , the group is set to the current thread's thread group. |
name |
String : the name of the new thread |
Throws | |
---|---|
SecurityException |
if the current thread cannot create a thread in the specified thread group |
Thread (Runnable target, String name)
分配一个新的Thread
对象。 这个构造函数与Thread (null, target, name)
具有相同的效果。
Parameters | |
---|---|
target |
Runnable : the object whose run method is invoked when this thread is started. If null , this thread's run method is invoked. |
name |
String : the name of the new thread |
Thread (ThreadGroup group, Runnable target, String name)
分配新的 Thread
对象,以便它具有 target
作为其运行对象,具有指定的 name
作为其名称,并且属于由 group
引用的线程组。
如果有安全管理器, checkAccess
ThreadGroup作为参数调用其 checkAccess
方法。
另外, checkPermission
方法在被直接或间接由覆盖 getContextClassLoader
或 setContextClassLoader
方法的子类的构造函数调用时调用 RuntimePermission("enableContextClassLoaderOverride")
权限。
新创建的线程的优先级设置等于创建它的线程的优先级,即当前正在运行的线程。 方法setPriority可用于将优先级改变为新值。
新创建的线程最初被标记为守护线程,当且仅当创建它的线程当前标记为守护线程。 方法setDaemon可用于更改线程是否为守护进程。
Parameters | |
---|---|
group |
ThreadGroup : the thread group. If null and there is a security manager, the group is determined by SecurityManager.getThreadGroup(). If there is not a security manager or SecurityManager.getThreadGroup() returns null , the group is set to the current thread's thread group. |
target |
Runnable : the object whose run method is invoked when this thread is started. If null , this thread's run method is invoked. |
name |
String : the name of the new thread |
Throws | |
---|---|
SecurityException |
if the current thread cannot create a thread in the specified thread group or cannot override the context class loader methods. |
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
参数的行为。
Parameters | |
---|---|
group |
ThreadGroup : the thread group. If null and there is a security manager, the group is determined by SecurityManager.getThreadGroup(). If there is not a security manager or SecurityManager.getThreadGroup() returns null , the group is set to the current thread's thread group. |
target |
Runnable : the object whose run method is invoked when this thread is started. If null , this thread's run method is invoked. |
name |
String : the name of the new thread |
stackSize |
long : the desired stack size for the new thread, or zero to indicate that this parameter is to be ignored. |
Throws | |
---|---|
SecurityException |
if the current thread cannot create a thread in the specified thread group |
int activeCount ()
返回当前线程thread group及其子组中活动线程数的估计值。 递归地遍历当前线程的线程组中的所有子组。
返回的值仅为估计值,因为线程数可能会动态变化,而此方法会遍历内部数据结构,并可能受某些系统线程的影响。 此方法主要用于调试和监控目的。
Returns | |
---|---|
int |
an estimate of the number of active threads in the current thread's thread group and in any other thread group that has the current thread's thread group as an ancestor |
void checkAccess ()
确定当前正在运行的线程是否有权修改此线程。
如果有安全管理器,则使用此线程作为其参数调用其checkAccess
方法。 这可能会导致投掷SecurityException
。
Throws | |
---|---|
SecurityException |
if the current thread is not allowed to access this thread. |
也可以看看:
int countStackFrames ()
此方法在API级别1中已弃用。
此调用的定义取决于suspend()
,已弃用。 此外,这次电话会议的结果从未明确定义。
计算此线程中堆栈帧的数量。 该线程必须暂停。
Returns | |
---|---|
int |
the number of stack frames in this thread. |
Throws | |
---|---|
IllegalThreadStateException |
if this thread is not suspended. |
Thread currentThread ()
返回对当前正在执行的线程对象的引用。
Returns | |
---|---|
Thread |
the currently executing thread. |
void destroy ()
此方法在API级别1中已弃用。
此方法最初设计用于销毁此线程而不进行任何清理。 它保存的任何监视器都将保持锁定状态。 但是,该方法从未实现过。 如果如果要实施的话,那么它就会像suspend()
容易出现死锁。 如果目标线程在销毁时保留了关键系统资源的锁,则线程无法再次访问此资源。 如果另一个线程试图锁定这个资源,会导致死锁。 这种僵局通常表现为“冻结”的过程。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。
抛出 UnsupportedOperationException
。
Throws | |
---|---|
UnsupportedOperationException |
always |
int enumerate (Thread[] tarray)
将当前线程的线程组及其子线程组中的每个活动线程复制到指定的数组中。 此方法只是调用当前线程的线程组的enumerate(Thread[])
方法。
应用程序可能会使用activeCount方法来估计数组的大小,但如果数组太短而无法保存所有线程,则额外的线程会被忽略。 如果获取当前线程的线程组及其子线程组中的每个活动线程非常重要,那么调用者应该验证返回的int值是否严格小于tarray
的长度。
由于这种方法固有的竞争条件,建议该方法仅用于调试和监控目的。
Parameters | |
---|---|
tarray |
Thread : an array into which to put the list of threads |
Returns | |
---|---|
int |
the number of threads put into the array |
Throws | |
---|---|
SecurityException |
if checkAccess() determines that the current thread cannot access its thread group |
Map<Thread, StackTraceElement[]> getAllStackTraces ()
返回所有活动线程的堆栈跟踪图。 映射键是线程,每个映射值都是StackTraceElement的数组,表示对应的Thread的堆栈转储。 返回的堆栈跟踪采用为getStackTrace
方法指定的格式。
这个方法被调用时线程可能正在执行。 每个线程的堆栈跟踪仅表示一个快照,并且可以在不同的时间获得每个堆栈跟踪。 如果虚拟机没有关于线程的堆栈跟踪信息,则将在映射值中返回一个零长度的数组。
如果有安全管理器,则安全管理器的 checkPermission方法被调用,并具有 RuntimePermission("getStackTrace")权限以及 RuntimePermission("modifyThreadGroup")权限,以查看是否可以获取所有线程的堆栈跟踪。
Returns | |
---|---|
Map<Thread, StackTraceElement[]> |
a Map from Thread to an array of StackTraceElement that represents the stack trace of the corresponding thread. |
Throws | |
---|---|
SecurityException |
if a security manager exists and its checkPermission method doesn't allow getting the stack trace of thread. |
ClassLoader getContextClassLoader ()
返回此线程的上下文ClassLoader。 上下文ClassLoader由线程的创建者提供,供加载类和资源时在此线程中运行的代码使用。 如果不是set ,则默认为父线程的ClassLoader上下文。 原始线程的上下文ClassLoader通常设置为用于加载应用程序的类加载器。
如果安全管理器存在,并且调用者的类加载器是不是 null
,是不一样或上下文类加载器的祖先,则此方法调用安全管理器的 checkPermission
方法与 RuntimePermission
("getClassLoader")
权限验证的是检索上下文类加载器是允许的。
Returns | |
---|---|
ClassLoader |
the context ClassLoader for this Thread, or null indicating the system class loader (or, failing that, the bootstrap class loader) |
Throws | |
---|---|
SecurityException |
if the current thread cannot get the context ClassLoader |
Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler ()
返回由于未捕获的异常而导致线程突然终止时调用的默认处理程序。 如果返回的值是null ,则没有默认值。
Returns | |
---|---|
Thread.UncaughtExceptionHandler |
long getId ()
返回此线程的标识符。 线程ID是在创建此线程时生成的正数long数字。 线程ID是唯一的,并且在其生命周期中保持不变。 当一个线程终止时,这个线程ID可能会被重用。
Returns | |
---|---|
long |
this thread's ID. |
int getPriority ()
返回此线程的优先级。
Returns | |
---|---|
int |
this thread's priority. |
也可以看看:
StackTraceElement[] getStackTrace ()
返回表示此线程的堆栈转储的堆栈跟踪元素的数组。 如果此线程尚未启动,已启动但尚未安排由系统运行或终止,此方法将返回一个零长度的数组。 如果返回的数组的长度非零,那么数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。 数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。
如果有一个安全管理器,并且此线程不是当前线程,则使用 RuntimePermission("getStackTrace")权限调用安全管理器的 checkPermission方法,以查看是否可以获取堆栈跟踪。
某些虚拟机在某些情况下可能会忽略堆栈跟踪中的一个或多个堆栈帧。 在极端情况下,不允许有关该线程的堆栈跟踪信息的虚拟机从该方法返回一个长度为零的数组。
Returns | |
---|---|
StackTraceElement[] |
an array of StackTraceElement, each represents one stack frame. |
Throws | |
---|---|
SecurityException |
if a security manager exists and its checkPermission method doesn't allow getting the stack trace of thread. |
Thread.State getState ()
返回此线程的状态。 此方法设计用于监视系统状态,而不是用于同步控制。
Returns | |
---|---|
Thread.State |
this thread's state. |
ThreadGroup getThreadGroup ()
返回此线程所属的线程组。 如果此线程已死(停止),此方法返回null。
Returns | |
---|---|
ThreadGroup |
this thread's thread group. |
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler ()
返回由于未捕获的异常而导致此线程突然终止时调用的处理函数。 如果此线程没有显式设置未捕获的异常处理程序,则返回此线程的ThreadGroup对象,除非此线程已终止,则返回null 。
Returns | |
---|---|
Thread.UncaughtExceptionHandler |
boolean holdsLock (Object obj)
当且仅当当前线程持有指定对象的监视器锁定时才返回 true 。
此方法旨在允许程序断言当前线程已保存指定的锁:
assert Thread.holdsLock(obj);
Parameters | |
---|---|
obj |
Object : the object on which to test lock ownership |
Returns | |
---|---|
boolean |
true if the current thread holds the monitor lock on the specified object. |
Throws | |
---|---|
NullPointerException |
if obj is null |
void interrupt ()
中断此线程。
除非当前线程正在自行中断,而这总是被允许的, checkAccess
将调用此线程的 checkAccess
方法,这可能会导致 SecurityException
被抛出。
如果该线程阻塞的调用 wait()
, wait(long)
,或 wait(long, int)
的方法 Object
类,或者在 join()
, join(long)
, join(long, int)
, sleep(long)
,或 sleep(long, int)
,这个类的方法,那么它的中断状态将被清除,并且将收到 InterruptedException
。
如果该线程在 interruptible channel
的I / O操作中被阻塞,则通道将被关闭,线程的中断状态将被设置,并且线程将收到
ClosedByInterruptException
。
如果此线程在 Selector
被阻塞,那么线程的中断状态将被设置,并且它将立即从选择操作中返回,可能具有非零值,就好像调用了选择器的 wakeup
方法一样。
如果以前的条件都不成立,那么该线程的中断状态将被设置。
中断不活动的线程不需要任何影响。
Throws | |
---|---|
SecurityException |
if the current thread cannot modify this thread |
boolean interrupted ()
测试当前线程是否被中断。 线程的中断状态通过此方法清除。 换句话说,如果这个方法要连续调用两次,第二次调用将返回false(除非当前线程再次中断,在第一次调用清除其中断状态之后,第二次调用检查之前)。
线程中断被忽略,因为线程在中断时未处于活动状态,将通过返回false的此方法反映出来。
Returns | |
---|---|
boolean |
true if the current thread has been interrupted; false otherwise. |
也可以看看:
boolean isAlive ()
测试此线程是否存在。 如果一个线程已经启动并且还没有死亡,那么这个线程是活着的。
Returns | |
---|---|
boolean |
true if this thread is alive; false otherwise. |
boolean isDaemon ()
测试此线程是否为守护程序线程。
Returns | |
---|---|
boolean |
true if this thread is a daemon thread; false otherwise. |
也可以看看:
boolean isInterrupted ()
测试该线程是否被中断。 此线程的中断状态不受此方法的影响。
线程中断被忽略,因为线程在中断时未处于活动状态,将通过返回false的此方法反映出来。
Returns | |
---|---|
boolean |
true if this thread has been interrupted; false otherwise. |
也可以看看:
void join ()
等待这个线程死亡。
此方法的调用的行为与调用完全相同
join
(0)
Throws | |
---|---|
InterruptedException |
if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown. |
void join (long millis)
此线程死亡最多等待millis
毫秒。 0
的超时意味着永远等待。
此实现使用this.wait
调用的一个循环,条件为this.isAlive
。 当一个线程终止时,调用this.notifyAll
方法。 建议应用程序不使用wait
, notify
,或notifyAll
上Thread
实例。
Parameters | |
---|---|
millis |
long : the time to wait in milliseconds |
Throws | |
---|---|
IllegalArgumentException |
if the value of millis is negative |
InterruptedException |
if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown. |
void join (long millis, int nanos)
等待最多 millis
毫秒加上 nanos
纳秒以使此线程死亡。
该实现使用this.wait
调用的一个循环,条件为this.isAlive
。 当一个线程终止时,调用this.notifyAll
方法。 建议应用程序不使用wait
, notify
,或notifyAll
上Thread
实例。
Parameters | |
---|---|
millis |
long : the time to wait in milliseconds |
nanos |
int : 0-999999 additional nanoseconds to wait |
Throws | |
---|---|
IllegalArgumentException |
if the value of millis is negative, or the value of nanos is not in the range 0-999999 |
InterruptedException |
if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown. |
void resume ()
此方法在API级别1中已弃用。
此方法仅供与suspend()
使用,由于它容易出现死锁,因此已弃用。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。
恢复暂停的线程。
首先,这个线程的checkAccess
方法被调用时没有参数。 这可能会导致抛出SecurityException
(在当前线程中)。
如果线程处于活动状态但暂停,它将被恢复并被允许在其执行过程中取得进展。
Throws | |
---|---|
SecurityException |
if the current thread cannot modify this thread. |
也可以看看:
void run ()
如果此线程是使用单独的Runnable
运行对象构建的,则Runnable
对象的run
方法; 否则,此方法不做任何事情并返回。
Thread
子类应该重写此方法。
void setContextClassLoader (ClassLoader cl)
为此线程设置上下文ClassLoader。 上下文ClassLoader可以在创建线程时设置,并允许线程的创建者通过getContextClassLoader
提供适当的类加载器,以便在加载类和资源时在线程中运行的代码。
如果安全管理器存在,则使用 RuntimePermission
("setContextClassLoader")
权限调用其 checkPermission
方法,以查看是否允许设置上下文ClassLoader。
Parameters | |
---|---|
cl |
ClassLoader : the context ClassLoader for this Thread, or null indicating the system class loader (or, failing that, the bootstrap class loader) |
Throws | |
---|---|
SecurityException |
if the current thread cannot set the context ClassLoader |
void setDaemon (boolean on)
将此线程标记为daemon线程或用户线程。 当只有运行的线程都是守护进程线程时,Java虚拟机才会退出。
该方法必须在线程启动之前调用。
Parameters | |
---|---|
on |
boolean : if true , marks this thread as a daemon thread |
Throws | |
---|---|
IllegalThreadStateException |
if this thread is alive |
SecurityException |
if checkAccess() determines that the current thread cannot modify this thread |
void setDefaultUncaughtExceptionHandler (Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获的异常而突然终止时调用的缺省处理程序,并且没有为该线程定义其他处理程序。
未捕获的异常处理首先由线程控制,然后由线程的ThreadGroup
对象控制,最后由默认的未捕获异常处理ThreadGroup
。 如果线程没有明确的未捕获异常处理程序集,并且线程的线程组(包括父线程组)未专门化其uncaughtException方法,则将调用默认处理程序的uncaughtException方法。
通过设置默认的未捕获异常处理程序,应用程序可以更改处理未捕获异常的方式(例如登录到特定设备或文件),这些线程已经接受系统提供的任何“默认”行为。
请注意,默认的未捕获异常处理程序通常不应该延迟到线程的 ThreadGroup对象,因为这可能会导致无限递归。
Parameters | |
---|---|
eh |
Thread.UncaughtExceptionHandler : the object to use as the default uncaught exception handler. If null then there is no default handler. |
Throws | |
---|---|
SecurityException |
if a security manager is present and it denies RuntimePermission ("setDefaultUncaughtExceptionHandler") |
void setName (String name)
将此线程的名称更改为等于参数 name
。
首先调用这个线程的checkAccess
方法,不带任何参数。 这可能会导致投掷SecurityException
。
Parameters | |
---|---|
name |
String : the new name for this thread. |
Throws | |
---|---|
SecurityException |
if the current thread cannot modify this thread. |
也可以看看:
void setPriority (int newPriority)
改变这个线程的优先级。
首先调用此线程的checkAccess
方法,不带任何参数。 这可能会导致投掷SecurityException
。
否则,此线程的优先级设置为指定的 newPriority
和线程线程组的最大允许优先级中的较小者。
Parameters | |
---|---|
newPriority |
int : priority to set this thread to |
Throws | |
---|---|
IllegalArgumentException |
If the priority is not in the range MIN_PRIORITY to MAX_PRIORITY . |
SecurityException |
if the current thread cannot modify this thread. |
void setUncaughtExceptionHandler (Thread.UncaughtExceptionHandler eh)
设置由于未捕获的异常而导致此线程突然终止时调用的处理函数。
线程可以通过显式设置未捕获的异常处理程序来完全控制它如何响应未捕获的异常。 如果没有设置这样的处理程序,那么该线程的ThreadGroup对象充当其处理程序。
Parameters | |
---|---|
eh |
Thread.UncaughtExceptionHandler : the object to use as this thread's uncaught exception handler. If null then this thread has no explicit handler. |
Throws | |
---|---|
SecurityException |
if the current thread is not allowed to modify this thread. |
void sleep (long millis, int nanos)
使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数加上指定的纳秒数,这取决于系统定时器和调度程序的精度和准确性。 该线程不会丢失任何监视器的所有权。
Parameters | |
---|---|
millis |
long : the length of time to sleep in milliseconds |
nanos |
int : 0-999999 additional nanoseconds to sleep |
Throws | |
---|---|
IllegalArgumentException |
if the value of millis is negative, or the value of nanos is not in the range 0-999999 |
InterruptedException |
if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown. |
void sleep (long millis)
使系统定时器和调度程序的精确性和准确性,使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数。 该线程不会丢失任何监视器的所有权。
Parameters | |
---|---|
millis |
long : the length of time to sleep in milliseconds |
Throws | |
---|---|
IllegalArgumentException |
if the value of millis is negative |
InterruptedException |
if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown. |
void start ()
导致此线程开始执行; Java虚拟机调用此线程的run
方法。
结果是两个线程同时运行:当前线程(从调用返回到 start
方法)和另一个线程(它执行其 run
方法)。
多次启动线程永远不合法。 特别是,线程一旦完成执行就不会重新启动。
Throws | |
---|---|
IllegalThreadStateException |
if the thread was already started. |
void stop ()
此方法在API级别1中已弃用。
这种方法本质上是不安全的。 停止螺纹与使用Thread.stop使其解锁所有它已经锁定(作为未选中的自然结果监视器的ThreadDeath
异常堆栈向上传播)。 如果之前由这些监视器保护的任何对象处于不一致状态,则损坏的对象对其他线程可见,可能导致任意行为。 stop
许多用途应该被代码替换,该代码只是修改某些变量以指示目标线程应该停止运行。 目标线程应该定期检查这个变量,并且如果变量指示它将停止运行,则从其run方法有序地返回。 如果目标线程等待很长时间(例如,在条件变量上),则应该使用interrupt
方法来中断等待。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。
强制线程停止执行。
如果安装了安全管理器, checkAccess
this
作为参数调用其checkAccess
方法。 这可能会导致SecurityException
被引发(在当前线程中)。
如果此线程与当前线程不同(即当前线程试图停止除本身之外的其他线程),则另外调用安全管理器的checkPermission
方法(使用RuntimePermission("stopThread")
参数)。 再次,这可能会导致投掷SecurityException
(在当前线程中)。
此线程代表的线程都被迫停止不管它是异常做,并抛出一个新创建 ThreadDeath
对象,作为异常。
允许停止尚未启动的线程。 如果线程最终启动,它会立即终止。
一个应用程序通常不应该尝试捕捉ThreadDeath
除非它必须执行一些非凡的清理操作(注意ThreadDeath
的抛出导致finally
语句的try
子句在线程正式死亡之前执行)。 如果catch
子句捕获一个ThreadDeath
对象,重新引入该对象以使线程实际上死亡非常重要。
对未捕获的异常做出反应的顶级错误处理程序不会输出消息或以其他方式通知应用程序,如果未捕获的异常是 ThreadDeath
的实例。
Throws | |
---|---|
SecurityException |
if the current thread cannot modify this thread. |
void stop (Throwable obj)
此方法在API级别1中已弃用。
这种方法本质上是不安全的。 有关详细信息,请参阅stop()
。 这种方法的另一个危险是它可能被用来生成目标线程没有准备处理的异常(包括线程不可能抛出的检查异常,如果不是这种方法)。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。
强制线程停止执行。
如果安装了安全管理器,则会调用此线程的 checkAccess
方法,这可能会导致 SecurityException
(在当前线程中)引发。
如果此线程与当前线程不同(即当前线程试图停止非线程本身),或者obj
不是obj
的实例,则ThreadDeath
安全管理器的checkPermission
方法(使用RuntimePermission("stopThread")
参数) 。 再次,这可能会导致投掷SecurityException
(在当前线程中)。
如果参数 obj
为空, NullPointerException
引发 NullPointerException
(在当前线程中)。
由这个线程表示的线程被迫停止任何异常地执行,并且抛出Throwable
对象为obj
作为例外。 这是一个不寻常的行动; 通常,应该使用不带参数的stop
方法。
允许停止尚未启动的线程。 如果线程最终启动,它会立即终止。
Parameters | |
---|---|
obj |
Throwable : the Throwable object to be thrown. |
Throws | |
---|---|
SecurityException |
if the current thread cannot modify this thread. |
NullPointerException |
if obj is null. |
void suspend ()
此方法在API级别1中已弃用。
此方法已被弃用,因为它本质上容易出现死锁。 如果目标线程在监视器上保留一个锁定,以便在暂停时保护关键系统资源,则在目标线程恢复之前,线程无法访问此资源。 如果在调用resume
之前将恢复目标线程的线程尝试锁定此监视器, resume
导致死锁。 这种僵局通常表现为“冻结”的过程。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。
暂停此主题。
首先,这个线程的checkAccess
方法被调用时没有参数。 这可能会导致投掷SecurityException
(在当前线程中)。
如果线程处于活动状态,它将被暂停并且不会继续前进,除非和直到恢复。
Throws | |
---|---|
SecurityException |
if the current thread cannot modify this thread. |
也可以看看:
String toString ()
返回此线程的字符串表示形式,包括线程的名称,优先级和线程组。
Returns | |
---|---|
String |
a string representation of this thread. |
void yield ()
向调度程序提示当前线程愿意产生当前使用的处理器。 调度程序可以自由地忽略这个提示。
良率是一种启发式尝试,旨在改善线程之间的相对进程,否则会过度使用CPU。 它的使用应该与详细的性能分析和基准测试相结合,以确保它实际上具有预期的效果。
使用这种方法很少合适。 对于调试或测试目的可能有用,它可能有助于重现由于竞态条件而产生的错误。 在设计诸如java.util.concurrent.locks
包中的并发控制结构时,它也可能很有用。
Object clone ()
作为线程引发CloneNotSupportedException不能被有意克隆。 改为构建新的线程。
Returns | |
---|---|
Object |
a clone of this instance. |
Throws | |
---|---|
CloneNotSupportedException |
always |