所在包:java.lang.Thread
public class Thread
extends Object
implements Runnable
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread
对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main
方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
Runtime
类的 exit
方法,并且安全管理器允许退出操作发生。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
。
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()
对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
|
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
public static final int MIN_PRIORITY
public static final int NORM_PRIORITY
public static final int NORM_PRIORITY
public Thread()
Thread
对象。 此构造具有相同的效果Thread (null, null, gname)
,其中gname
是新生成的名字。 自动生成的名称格式为"Thread-"+
n ,其中n为整数。public Thread(Runnable target)
Thread
对象。 该构造函数具有与Thread (null, target, gname)
相同的效果,其中gname
是新生成的名称。 自动生成的名称格式为"Thread-"+
n ,其中n为整数。target
- 启动此线程时调用其run
方法的对象。 如果null
,这个类run
方法什么都不做。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
- 如果当前线程不能在指定的线程组中创建线程 public Thread(String name)
Thread
对象。 此构造具有相同的效果Thread (null, null, name)
。name
- 新线程的名称 public Thread(ThreadGroup group,
String name)
Thread
对象。 此构造具有相同的效果Thread (group, null, name)
。group
- 线程组。 如果是null
并且有一个安全管理器,则该组由SecurityManager.getThreadGroup()决定 。 如果没有安全管理员或SecurityManager.getThreadGroup()
返回null
,则该组将设置为当前线程的线程组。name
- 新线程的名称SecurityException
- 如果当前线程无法在指定的线程组中创建线程 public Thread(Runnable target,
String name)
Thread
对象。 此构造具有相同的效果Thread (null, target, name)
。target
- 启动此线程时调用其run
方法的对象。 如果null
,则调用此线程的run方法。name
- 新线程的名称 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
- 如果当前线程不能在指定的线程组中创建线程,或者不能覆盖上下文类加载器方法。 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
方法)。
不止一次启动线程是不合法的。 特别地,一旦线程完成执行就可能不会重新启动。
IllegalThreadStateException
- 如果线程已经启动。run()
, stop()
public void run()
Runnable
运行对象构造的,则Runnable
对象的run
方法; 否则,此方法不执行任何操作并返回。
Thread的Thread
应该覆盖此方法。
run
在界面 Runnable
start()
, stop()
, Thread(ThreadGroup, Runnable, String)
@Deprecated
public final void 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
。
@Deprecated
public final void stop(Throwable obj)
Throwable
作为例外。 它本质上是不安全的(详见stop()
),此外还可用于生成目标线程未准备处理的异常。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 UnsupportedOperationException
。obj
- 忽略 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
- 如果当前线程不能修改此线程 public static boolean interrupted()
忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
true
如果当前线程已被中断; false
否则。isInterrupted()
public boolean isInterrupted()
忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
true
如果这个线程已被中断; false
否则。interrupted()
@Deprecated
public void destroy()
suspend()
的方式会是僵死的 。 如果目标线程在销毁时保护关键系统资源的锁,则无法再次访问该资源。 如果另一个线程曾尝试锁定此资源,将导致死锁。 这种僵局通常表现为“冻结”过程。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 NoSuchMethodError
- 永远 public final boolean isAlive()
true
如果这个线程还活着; false
否则。public final boolean isAlive()
true
如果这个线程还活着; false
否则。@Deprecated
public final void suspend()
resume
之前尝试锁定此监视器, resume
导致死锁。 这种僵局通常表现为“冻结”过程。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 首先,这个线程的checkAccess
方法被调用,没有参数。 这可能会导致SecurityException
(在当前线程中)。
如果线程活着,它将被暂停,并且不会进一步进行,除非和直到恢复。
SecurityException
- 如果当前线程不能修改此线程。checkAccess()
@Deprecated
public final void resume()
suspend()
,由于它是死锁倾向,因此已被弃用。 有关更多信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 首先,这个线程的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方法来估计数组的大小,但是如果数组太短而不能容纳所有线程,则会忽略额外的线程。 如果在当前线程组及其子组中获取每个活动线程至关重要,则调用者应验证返回的int值是否严格小于tarray
的长度。
由于本方法中固有的竞争条件,建议该方法仅用于调试和监控。
tarray
- 放置线程列表的数组SecurityException
- 如果 ThreadGroup.checkAccess()
确定当前线程无法访问其线程组 @Deprecated
public int countStackFrames()
suspend()
,它被废弃了。 此外,此呼叫的结果从未明确。 IllegalThreadStateException
- 如果此线程未挂起。 public final void join(long millis)
throws InterruptedException
millis
毫秒。 0
的超时意味着永远等待。
此实现使用this.wait
调用的循环,条件为this.isAlive
。 当线程终止时,调用this.notifyAll
方法。 建议应用程序不使用wait
, notify
,或notifyAll
上Thread
实例。
millis
- 以毫秒为单位等待的时间IllegalArgumentException
- 如果 millis
值为负InterruptedException
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。public final void join(long millis)
throws InterruptedException
millis
毫秒。 0
的超时意味着永远等待。
此实现使用this.wait
调用的循环,条件为this.isAlive
。 当线程终止时,调用this.notifyAll
方法。 建议应用程序不使用wait
, notify
,或notifyAll
上Thread
实例。
millis
- 以毫秒为单位等待的时间IllegalArgumentException
- 如果 millis
值为负InterruptedException
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。public final void join()
throws InterruptedException
调用此方法的行为方式与调用完全相同
(0)
InterruptedException
- 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。public static void dumpStack()
public final void setDaemon(boolean on)
线程启动前必须调用此方法。
on
- 如果 true
,将此线程标记为守护线程IllegalThreadStateException
- 如果这个线程是 aliveSecurityException
- 如果 checkAccess()
确定当前线程不能修改此线程 public final boolean isDaemon()
true
如果这个线程是一个守护线程; false
否则。setDaemon(boolean)
public final void checkAccess()
如果有一个安全管理器,它的checkAccess
方法被调用这个线程作为它的参数。 这可能会导致投掷SecurityException
。
SecurityException
- 如果当前线程不允许访问此线程。SecurityManager.checkAccess(Thread)
public ClassLoader getContextClassLoader()
如果安全管理器存在,并且调用者的类加载器不是null
,并且与上下文类加载器的祖先不一样或者祖先,则该方法调用安全管理器的checkPermission
方法,具有RuntimePermission
("getClassLoader")
权限,以验证是否检索上下文类加载器是允许的。
null
指示系统类加载器(或者失败的是引导类加载器)SecurityException
- 如果当前线程无法获取上下文ClassLoaderpublic void setContextClassLoader(ClassLoader cl)
getContextClassLoader
提供相应的类加载器,以便在加载类和资源时在线程中运行代码。
如果存在安全管理员,则其checkPermission
方法将被调用RuntimePermission
("setContextClassLoader")
权限,以查看是否允许设置上下文ClassLoader。
cl
- 此线程的上下文ClassLoader,或指示系统类加载器的空值(或者,失败的是引导类加载器)SecurityException
- 如果当前线程不能设置上下文ClassLoaderpublic static boolean holdsLock(Object obj)
该方法旨在允许程序断言当前线程已经保存指定的锁:
assert Thread.holdsLock(obj);
obj
- 测试锁拥有权的对象NullPointerException
- 如果obj是 nullpublic StackTraceElement[] getStackTrace()
如果有一个安全管理器,并且这个线程不是当前的线程,那么安全管理器的checkPermission方法被调用一个RuntimePermission("getStackTrace")权限来查看是否可以获取堆栈跟踪。
在某些情况下,某些虚拟机可能从堆栈跟踪中省略一个或多个堆栈帧。 在极端情况下,允许没有关于该线程的堆栈跟踪信息的虚拟机从该方法返回零长度数组。
SecurityException
- 如果安全管理器存在,并且其 checkPermission方法不允许获取线程的堆栈跟踪。SecurityManager.checkPermission(java.security.Permission)
, RuntimePermission
, Throwable.getStackTrace()
public static Map<Thread,StackTraceElement[]> getAllStackTraces()
getStackTrace
方法指定的格式。
线程可能正在执行,而此方法被调用。 每个线程的堆栈跟踪仅表示快照,并且可以在不同时间获取每个堆栈跟踪。 如果虚拟机没有关于线程的堆栈跟踪信息,则将在地图值中返回零长度的数组。
如果有一个安全管理员,那么安全管理员的checkPermission方法被调用一个RuntimePermission("getStackTrace")权限以及RuntimePermission("modifyThreadGroup")权限来查看是否可以获取所有线程的堆栈跟踪。
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 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 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 void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
线程可以完全控制如何通过明确设置其未捕获的异常处理来响应未捕获的异常。 如果没有设置这样的处理程序,那么线程的ThreadGroup对象将作为其处理程序。
eh
- 用作此线程未捕获的异常处理程序的对象。 如果null那么这个线程没有明确的处理程序。SecurityException
- 如果当前线程不允许修改此线程。setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
, ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
原文:https://www.cnblogs.com/LinQingYang/p/12431558.html