阅读(1252) (6)

鸿蒙OS Thread

2022-04-28 16:02:49 更新

Thread

java.lang.Object

|---java.lang.Thread

public class Thread
extends Object
implements Runnable

线程是程序中的执行线程。 Java 虚拟机允许应用程序同时运行多个执行线程。

每个线程都有一个优先级。具有较高优先级的线程优先于具有较低优先级的线程执行。每个线程可能会也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时,它才是守护线程。

当 Java 虚拟机启动时,通常有一个非守护线程(通常调用某个指定类的名为 main 的方法)。 Java 虚拟机继续执行线程,直到发生以下任一情况:

  • 已调用 Runtime 类的退出方法,并且安全管理器已允许进行退出操作。
  • 所有不是守护线程的线程都已经死亡,要么从调用 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 方法。 然后可以分配一个类的实例,在创建线程时作为参数传递,然后启动。 这种其他样式的相同示例如下所示:

     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。

嵌套类摘要

修饰符和类型 描述
static class Thread.State 线程状态。
static interface Thread.UncaughtExceptionHandler 当线程由于未捕获的异常而突然终止时调用的处理程序接口。

字段摘要

修饰符和类型 字段 描述
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) 分配一个新的 Thread 对象,使其以 target 作为其运行对象,以指定的名称作为其名称,并属于 group 所引用的线程组。
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配一个新的 Thread 对象,使其以 target 作为其运行对象,以指定的名称作为其名称,并属于由 group 引用的线程组,并具有指定的堆栈大小。
Thread(ThreadGroup group, String name) 分配一个新的 Thread 对象。

方法总结

修饰符和类型 方法 描述
static int activeCount() 返回当前线程的线程组及其子组中活动线程数的估计值。
void checkAccess() 确定当前运行的线程是否有权修改该线程。
protected Object clone() 抛出 CloneNotSupportedException,因为 Thread 不能被有意义地克隆。
int countStackFrames() 已弃用。 此调用的定义取决于已弃用的suspend()。 此外,此调用的结果从未明确定义。
static Thread currentThread() 返回对当前正在执行的线程对象的引用。
void destroy() 已弃用。 此方法最初设计用于在不进行任何清理的情况下销毁此线程。 它持有的任何监视器都将保持锁定状态。 但是,该方法从未实施。 如果要实现的话,它会像suspend()那样容易死锁。 如果目标线程在关键系统资源被销毁时持有保护它的锁,则没有线程可以再次访问该资源。 如果另一个线程曾经试图锁定这个资源,就会导致死锁。 这种死锁通常表现为“冻结”进程。
static void dumpStack() 将当前线程的堆栈跟踪打印到标准错误流。
static int enumerate(Thread[] tarray) 将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中。
static MapThread,StackTraceElement[] getAllStackTraces() 返回所有活动线程的堆栈跟踪映射。
ClassLoader getContextClassLoader() 返回此线程的上下文 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) 最多等待几毫秒让该线程终止。
void join(long millis, int nanos) 最多等待毫秒加上纳秒以使该线程终止。
void resume() 已弃用。 此方法仅用于与suspend() 一起使用,该方法已被弃用,因为它容易发生死锁。
void run() 如果该线程是使用单独的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法; 否则,此方法不执行任何操作并返回。
void setContextClassLoader(ClassLoader cl) 设置此线程的上下文 ClassLoader。
void setDaemon(boolean on) 将此线程标记为守护线程或用户线程。
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且没有为该线程定义其他处理程序。
void setName(String 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 异常沿堆栈传播的自然结果)。 如果以前受这些监视器保护的任何对象处于不一致状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。 停止的许多用法应该由简单地修改一些变量以指示目标线程应该停止运行的代码替换。 目标线程应该定期检查这个变量,如果变量指示它要停止运行,则以有序的方式从它的run方法返回。 如果目标线程等待很长时间(例如在条件变量上),则应使用中断方法来中断等待。
void stop(Throwable obj) 已弃用。 此方法最初旨在强制线程停止并将给定的 Throwable 作为异常抛出。 它本质上是不安全的(有关详细信息,请参阅 stop()),此外,它还可用于生成目标线程未准备好处理的异常。
void suspend() 已弃用。 此方法已被弃用,因为它本质上容易死锁。 如果目标线程在暂停时对保护关键系统资源的监视器持有锁,则在目标线程恢复之前没有线程可以访问该资源。 如果将恢复目标线程的线程在调用 resume 之前尝试锁定此监视器,则会导致死锁。 这种死锁通常表现为“冻结”进程。
String toString() 返回此线程的字符串表示形式,包括线程的名称、优先级和线程组。
static void yield() 向调度程序提示当前线程愿意放弃其当前对处理器的使用。
从类 java.lang.Object 继承的方法
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

字段详细信息

MAX_PRIORITY

public static final int MAX_PRIORITY

线程可以拥有的最大优先级。

MIN_PRIORITY

public static final int MIN_PRIORITY

线程可以拥有的最低优先级。

NORM_PRIORITY

public static final int NORM_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 方法的对象。 如果为 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 方法。

Throws:

Throw名称 Throw描述
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 新线程的名称

Throws:

Throw名称 Throw描述
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 作为其运行对象,以指定的名称作为其名称,并属于 group 所引用的线程组。

如果有安全管理器,则使用 ThreadGroup 作为其参数调用其 SecurityManager#checkAccess(ThreadGroup) 方法。

此外,当覆盖 getContextClassLoader 或 setContextClassLoader 方法的子类的构造函数直接或间接调用时,它的 checkPermission 方法使用 RuntimePermission("enableContextClassLoaderOverride") 权限调用。

新创建线程的优先级设置为等于创建它的线程的优先级,即当前运行的线程。方法 setPriority 可用于将优先级更改为新值。

当且仅当创建它的线程当前被标记为守护线程时,新创建的线程最初被标记为守护线程。方法 setDaemon 可用于更改线程是否为守护进程。

参数:

参数名称 参数描述
group 线程组。 如果为 null 并且存在安全管理器,则该组由 SecurityManager#getThreadGroup 确定。 如果没有安全管理器或 SecurityManager.getThreadGroup() 返回 null,则将该组设置为当前线程的线程组。
target 此线程启动时调用其 run 方法的对象。 如果为 null,则调用此线程的 run 方法。
name 新线程的名称

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程无法在指定线程组中创建线程或无法覆盖上下文类加载器方法。

Thread

public Thread(ThreadGroup group, Runnable target, String name, long stackSize)

分配一个新的 Thread 对象,使其以 target 作为其运行对象,以指定的名称作为其名称,并属于由 group 引用的线程组,并具有指定的堆栈大小。

此构造函数与 Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.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 新线程所需的堆栈大小,或为零表示要忽略此参数。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程无法在指定线程组中创建线程

方法详情

currentThread

public static Thread currentThread()

返回对当前正在执行的线程对象的引用。

返回:

当前正在执行的线程。

yield

public static void yield()

向调度程序提示当前线程愿意放弃其当前对处理器的使用。 调度程序可以随意忽略此提示。

Yield 是一种启发式尝试,旨在改善线程之间的相对进展,否则会过度使用 CPU。 它的使用应与详细的分析和基准测试相结合,以确保它实际上具有预期的效果。

很少使用这种方法。 它对于调试或测试目的可能很有用,它可能有助于重现由于竞争条件导致的错误。 在设计并发控制结构(例如 java.util.concurrent.locks 包中的结构)时,它也可能很有用。

sleep

public static void sleep(long millis) throws InterruptedException

使当前执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。 该线程不会失去任何监视器的所有权。

参数:

参数名称 参数描述
millis 以毫秒为单位的睡眠时间长度

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果毫秒的值为负
InterruptedException 如果任何线程中断了当前线程。 抛出此异常时清除当前线程的中断状态。

sleep

public static void sleep(long millis, int nanos) throws InterruptedException

使当前执行的线程休眠(暂时停止执行)指定的毫秒数加上指定的纳秒数,具体取决于系统计时器和调度程序的精度和准确性。 该线程不会失去任何监视器的所有权。

参数:

参数名称 参数描述
millis 以毫秒为单位的睡眠时间长度
nanos 0-999999 额外的纳秒睡眠

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果 millis 的值为负,或者 nanos 的值不在 0-999999 范围内
InterruptedException 如果任何线程中断了当前线程。 抛出此异常时清除当前线程的中断状态。

clone

protected Object clone() throws CloneNotSupportedException

抛出 CloneNotSupportedException,因为 Thread 不能被有意义地克隆。 而是构建一个新线程。

覆盖:

在类 Object 中克隆

返回:

此实例的克隆。

Throws:

Throw名称 Throw描述
CloneNotSupportedException 总是

start

public void start()

使该线程开始执行; Java 虚拟机调用该线程的 run 方法。

结果是两个线程同时运行:当前线程(从对 start 方法的调用返回)和另一个线程(执行其 run 方法)。

多次启动一个线程是不合法的。 特别是,线程一旦完成执行就可能不会重新启动。

抛出:

Throw名称 Throw描述
IllegalThreadStateException 如果线程已经启动。

run

public void run()

如果该线程是使用单独的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法; 否则,此方法不执行任何操作并返回。

Thread 的子类应覆盖此方法。

指定者:

在接口 Runnable 中运行

stop

@Deprecated public final void stop()

已弃用。这种方法本质上是不安全的。使用 Thread.stop 停止线程会导致它解锁所有已锁定的监视器(这是未经检查的 ThreadDeath 异常沿堆栈传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。停止的许多用法应该由简单地修改一些变量以指示目标线程应该停止运行的代码替换。目标线程应该定期检查这个变量,如果变量指示它要停止运行,则以有序的方式从它的run方法返回。如果目标线程等待很长时间(例如在条件变量上),则应使用中断方法来中断等待。

强制线程停止执行。

如果安装了安全管理器,则调用其 checkAccess 方法,并将 this 作为其参数。这可能会导致引发 SecurityException(在当前线程中)。

如果此线程与当前线程不同(即当前线程试图停止除自身之外的线程),则另外调用安全管理器的 checkPermission 方法(带有 RuntimePermission("stopThread") 参数)。同样,这可能会导致抛出 SecurityException(在当前线程中)。

这个线程所代表的线程被强制停止它正在做的任何异常,并抛出一个新创建的 ThreadDeath 对象作为异常。

允许停止尚未启动的线程。如果线程最终启动,它会立即终止。

应用程序通常不应该尝试捕获 ThreadDeath,除非它必须执行一些特别的清理操作(请注意,抛出 ThreadDeath 会导致 try 语句的 finally 子句在线程正式终止之前执行)。如果一个 catch 子句捕获了一个 ThreadDeath 对象,那么重新抛出该对象以使线程真正终止是很重要的。

如果未捕获的异常是 ThreadDeath 的实例,则对其他未捕获的异常做出反应的顶级错误处理程序不会打印出消息或以其他方式通知应用程序。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不能修改这个线程。

stop

@Deprecated public final void stop(Throwable obj)

已弃用。 此方法最初旨在强制线程停止并将给定的 Throwable 作为异常抛出。 它本质上是不安全的(有关详细信息,请参阅 stop()),此外,它还可用于生成目标线程未准备好处理的异常。

引发 UnsupportedOperationException。

参数:

参数名称 参数描述
obj 忽略

interrupt

public void interrupt()

中断这个线程。

除非当前线程正在中断自己,这总是允许的,否则会调用该线程的 checkAccess 方法,这可能会导致抛出 SecurityException。

如果此线程在调用 Object 类的 Object#wait()、Object#wait(long) 或 Object#wait(long, int) 方法或 join()、join(long) 方法时被阻塞, join(long,int)、sleep(long) 或 sleep(long,int) 方法,则其中断状态将被清除并收到 InterruptedException。

如果该线程在 InterruptibleChannel 上的 I/O 操作中被阻塞,则通道将关闭,线程的中断状态将被设置,线程将收到 ClosedByInterruptException。

如果该线程在 Selector 中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能带有非零值,就像调用了选择器的唤醒方法一样。

如果前面的条件都不成立,则将设置该线程的中断状态。

中断一个不活动的线程不需要有任何效果。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不能修改这个线程

interrupted

public static boolean interrupted()

测试当前线程是否被中断。 通过该方法清除线程的中断状态。 换句话说,如果这个方法被连续调用两次,第二次调用将返回 false(除非当前线程再次被中断,在第一次调用清除其中断状态之后,第二次调用检查它之前)。

由于在中断时线程不活动而被忽略的线程中断将通过此方法返回 false 来反映。

返回:

如果当前线程已被中断,则为 true; 否则为false。

isInterrupted

public boolean isInterrupted()

测试此线程是否已被中断。 线程的中断状态不受此方法的影响。

由于在中断时线程不活动而被忽略的线程中断将通过此方法返回 false 来反映。

返回:

如果此线程已被中断,则为 true; 否则为 false。

destroy

@Deprecated public void destroy()

已弃用。 此方法最初设计用于在不进行任何清理的情况下销毁此线程。 它持有的任何监视器都将保持锁定状态。 但是,该方法从未实施。 如果要实现的话,它会像suspend()那样容易死锁。 如果目标线程在关键系统资源被销毁时持有保护它的锁,则没有线程可以再次访问该资源。 如果另一个线程曾经试图锁定这个资源,就会导致死锁。 这种死锁通常表现为“冻结”进程。

引发 NoSuchMethodError。

Throws:

Throw名称 Throw描述
NoSuchMethodError 总是

isAlive

public final boolean isAlive()

测试此线程是否存在。 如果线程已启动且尚未死亡,则该线程处于活动状态。

返回:

如果该线程还活着,则为 true; 否则为false。

suspend

@Deprecated public final void suspend()

已弃用。 此方法已被弃用,因为它本质上容易死锁。 如果目标线程在暂停时对保护关键系统资源的监视器持有锁,则在目标线程恢复之前没有线程可以访问该资源。 如果将恢复目标线程的线程在调用 resume 之前尝试锁定此监视器,则会导致死锁。 这种死锁通常表现为“冻结”进程。

暂停此线程。

首先,调用该线程的 checkAccess 方法时不带任何参数。 这可能会导致抛出 SecurityException(在当前线程中)。

如果线程是活动的,它会被挂起并且不会继续前进,除非它被恢复。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不能修改这个线程。

resume

@Deprecated public final void resume()

已弃用。 此方法仅用于与suspend() 一起使用,该方法已被弃用,因为它容易发生死锁。

恢复挂起的线程。

首先,调用该线程的 checkAccess 方法时不带任何参数。 这可能会导致抛出 SecurityException(在当前线程中)。

如果线程处于活动状态但被挂起,它会被恢复并被允许在其执行中取得进展。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不能修改这个线程。

setPriority

public final void setPriority(int newPriority)

更改此线程的优先级。

首先调用该线程的 checkAccess 方法,不带任何参数。 这可能会导致抛出 SecurityException。

否则,此线程的优先级设置为指定的 newPriority 和线程的线程组的最大允许优先级中的较小者。

参数:

参数名称 参数描述
newPriority 将此线程设置为的优先级

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果优先级不在 MIN_PRIORITY 到 MAX_PRIORITY 范围内。
SecurityException 如果当前线程不能修改这个线程。

getPriority

public final int getPriority()

返回此线程的优先级。

返回:

这个线程的优先级。

setName

public final void setName(String name)

将此线程的名称更改为等于参数名称。

首先调用该线程的 checkAccess 方法,不带任何参数。 这可能会导致抛出 SecurityException。

参数:

参数名称 参数描述
name 此线程的新名称。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不能修改这个线程。

getName

public final String getName()

返回此线程的名称。

返回:

此线程的名称。

getThreadGroup

public final ThreadGroup getThreadGroup()

返回该线程所属的线程组。 如果此线程已终止(已停止),则此方法返回 null。

返回:

此线程的线程组。

activeCount

public static int activeCount()

返回当前线程的线程组及其子组中活动线程数的估计值。 递归迭代当前线程的线程组中的所有子组。

返回的值只是一个估计值,因为在此方法遍历内部数据结构时线程数可能会动态变化,并且可能会受到某些系统线程的存在的影响。 此方法主要用于调试和监视目的。

返回:

当前线程的线程组和以当前线程的线程组为祖先的任何其他线程组中的活动线程数的估计

enumerate

public static int enumerate(Thread[] tarray)

将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中。 该方法只是调用当前线程的线程组的 [ThreadGroup.enumerate(Thread]) 方法。

应用程序可能会使用 activeCount 方法来估计数组应该有多大,但是如果数组太短而无法容纳所有线程,那么额外的线程将被忽略。 如果获取当前线程的线程组及其子组中的每个活动线程至关重要,则调用程序应验证返回的 int 值是否严格小于 tarray 的长度。

由于此方法中固有的竞争条件,建议仅将该方法用于调试和监视目的。

参数:

参数名称 参数描述
tarray 将线程列表放入其中的数组

返回:

放入数组的线程数

Throws:

Throw名称 Throw描述
SecurityException if ThreadGroup.checkAccess() 判断当前线程无法访问其线程组

countStackFrames

@Deprecated public int countStackFrames()

已弃用。 此调用的定义取决于已弃用的suspend()。 此外,此调用的结果从未明确定义。

计算此线程中的堆栈帧数。 线程必须暂停。

返回:

此线程中的堆栈帧数。

Throws:

Throw名称 Throw描述
IllegalThreadStateException 如果这个线程没有被挂起。

join

public final void join(long millis) throws InterruptedException

最多等待几毫秒让该线程终止。 超时 0 意味着永远等待。

此实现使用以 this.isAlive 为条件的 this.wait 调用循环。 当线程终止时,将调用 this.notifyAll 方法。 建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。

参数:

参数名称 参数描述
millis 以毫秒为单位的等待时间

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果毫秒的值为负
InterruptedException 如果任何线程中断了当前线程。 抛出此异常时清除当前线程的中断状态。

join

public final void join(long millis, int nanos) throws InterruptedException

最多等待毫秒毫秒加上纳秒纳秒以使该线程终止。

此实现使用以 this.isAlive 为条件的 this.wait 调用循环。 当线程终止时,将调用 this.notifyAll 方法。 建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。

参数:

参数名称 参数描述
millis 以毫秒为单位的等待时间
nanos 0-999999 额外的纳秒等待

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果 millis 的值为负,或者 nanos 的值不在 0-999999 范围内
InterruptedException 如果任何线程中断了当前线程。 抛出此异常时清除当前线程的中断状态。

join

public final void join() throws InterruptedException

等待这个线程死掉。

此方法的调用与调用的行为方式完全相同

join(0)

Throws:

Throw名称 Throw描述
InterruptedException 如果任何线程中断了当前线程。 抛出此异常时清除当前线程的中断状态。

dumpStack

public static void dumpStack()

将当前线程的堆栈跟踪打印到标准错误流。 此方法仅用于调试。

setDaemon

public final void setDaemon(boolean on)

将此线程标记为守护线程或用户线程。 当唯一运行的线程都是守护线程时,Java 虚拟机退出。

此方法必须在线程启动之前调用。

参数:

参数名称 参数描述
on 如果为true,则将此线程标记为守护线程

Throws:

Throw名称 Throw描述
IllegalThreadStateException 如果这个线程还活着
SecurityException if checkAccess() 判断当前线程不能修改这个线程

isDaemon

public final boolean isDaemon()

测试此线程是否为守护线程。

返回:

如果此线程是守护线程,则为 true; 否则为假。

checkAccess

public final void checkAccess()

确定当前运行的线程是否有权修改该线程。

如果有一个安全管理器,它的 checkAccess 方法会以这个线程作为它的参数被调用。 这可能会导致抛出 SecurityException。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不允许访问该线程。

toString

public String toString()

返回此线程的字符串表示形式,包括线程的名称、优先级和线程组。

覆盖:

类 Object 中的 toString

返回:

此线程的字符串表示形式。

getContextClassLoader

public ClassLoader getContextClassLoader()

返回此线程的上下文 ClassLoader。 上下文 ClassLoader 由线程的创建者提供,供在该线程中运行的代码在加载类和资源时使用。 如果未设置,则默认为父线程的 ClassLoader 上下文。 原始线程的上下文 ClassLoader 通常设置为用于加载应用程序的类加载器。

如果存在安全管理器,并且调用者的类加载器不为 null 并且与上下文类加载器的祖先不同,则此方法调用安全管理器的 SecurityManager#checkPermission(java.security.Permission) 方法 RuntimePermission ("getClassLoader") 权限,用于验证是否允许检索上下文类加载器。

返回:

此线程的上下文 ClassLoader,或 null 指示系统类加载器(或者,如果失败,则为引导类加载器)

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程无法获取上下文 ClassLoader

setContextClassLoader

public void setContextClassLoader(ClassLoader cl)

设置此线程的上下文 ClassLoader。 上下文类加载器可以在创建线程时设置,并允许线程的创建者在加载类和资源时通过getContextClassLoader为线程中运行的代码提供合适的类加载器。

如果存在安全管理器,则使用 RuntimePermission ("setContextClassLoader") 权限调用其 SecurityManager#checkPermission(java.security.Permission) 方法,以查看是否允许设置上下文 ClassLoader。

参数:

参数名称 参数描述
cl 此线程的上下文 ClassLoader,或 null 指示系统类加载器(或者,如果失败,则为引导类加载器)

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程无法设置上下文 ClassLoader

holdsLock

public static boolean holdsLock(Object obj)

当且仅当当前线程持有指定对象上的监视器锁时才返回 true。

此方法旨在允许程序断言当前线程已经持有指定的锁:

     assert Thread.holdsLock(obj); 

参数:

参数名称 参数描述
obj 测试锁所有权的对象

返回:

如果当前线程持有指定对象的监视器锁,则为 true。

Throws:

Throw名称 Throw描述
NullPointerException 如果 obj 为null

getStackTrace

public StackTraceElement[] getStackTrace()

返回表示此线程的堆栈转储的堆栈跟踪元素数组。如果此线程尚未启动、已启动但尚未被系统调度运行或已终止,则此方法将返回一个长度为零的数组。如果返回的数组长度非零,则数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。数组的最后一个元素表示堆栈的底部,它是序列中最近的方法调用。

如果有一个安全管理器,并且这个线程不是当前线程,那么使用一个 RuntimePermission("getStackTrace") 权限调用安全管理器的 checkPermission 方法,看看是否可以获取堆栈跟踪。

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,允许没有关于该线程的堆栈跟踪信息的虚拟机从该方法返回一个长度为零的数组。

返回:

StackTraceElement 数组,每个代表一个堆栈帧。

Throws:

Throw名称 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法不允许获取线程的堆栈跟踪。

getAllStackTraces

public static MapThread,StackTraceElement[] getAllStackTraces()

返回所有活动线程的堆栈跟踪映射。 映射键是线程,每个映射值是一个 StackTraceElement 数组,表示相应线程的堆栈转储。 返回的堆栈跟踪采用为 getStackTrace 方法指定的格式。

调用此方法时线程可能正在执行。 每个线程的堆栈跟踪仅代表一个快照,并且每个堆栈跟踪可能在不同的时间获得。 如果虚拟机没有关于线程的堆栈跟踪信息,则将在映射值中返回一个长度为零的数组。

如果有安全管理器,则使用 RuntimePermission("getStackTrace") 权限和 RuntimePermission("modifyThreadGroup") 权限调用安全管理器的 checkPermission 方法,查看是否可以获取所有线程的堆栈跟踪。

返回:

从 Thread 到 StackTraceElement 数组的 Map,表示相应线程的堆栈跟踪。

Throws:

Throw名称 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法不允许获取线程的堆栈跟踪。

getId

public long getId()

返回此线程的标识符。 线程 ID 是创建此线程时生成的正长整数。 线程 ID 是唯一的,并且在其生命周期内保持不变。 当一个线程被终止时,这个线程 ID 可以被重用。

返回:

此线程的 ID。

getState

public Thread.State getState()

返回此线程的状态。 此方法设计用于监控系统状态,而不是用于同步控制。

返回:

这个线程的状态。

setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且没有为该线程定义其他处理程序。

未捕获的异常处理首先由线程控制,然后由线程的 ThreadGroup 对象控制,最后由默认的未捕获异常处理程序控制。 如果线程没有明确的未捕获异常处理程序集,并且线程的线程组(包括父线程组)没有专门化其 uncaughtException 方法,则将调用默认处理程序的 uncaughtException 方法。

通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程处理未捕获异常的方式(例如记录到特定设备或文件)。

请注意,默认的未捕获异常处理程序通常不应遵循线程的 ThreadGroup 对象,因为这可能导致无限递归。

参数:

参数名称 参数描述
eh 用作默认未捕获异常处理程序的对象。 如果为 null,则没有默认处理程序。

Throws:

Throw名称 Throw描述
SecurityException 如果存在安全管理器并且它拒绝 RuntimePermission ("setDefaultUncaughtExceptionHandler")

getDefaultUncaughtExceptionHandler

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()

返回当线程由于未捕获的异常而突然终止时调用的默认处理程序。 如果返回值为 null,则没有默认值。

返回:

所有线程的默认未捕获异常处理程序

getUncaughtExceptionHandler

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

返回当此线程由于未捕获的异常而突然终止时调用的处理程序。 如果该线程没有显式设置未捕获的异常处理程序,则返回该线程的 ThreadGroup 对象,除非该线程已终止,在这种情况下返回 null。

返回:

此线程的未捕获异常处理程序

setUncaughtExceptionHandler

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

设置当此线程由于未捕获的异常而突然终止时调用的处理程序。

线程可以通过显式设置其未捕获异常处理程序来完全控制它如何响应未捕获异常。 如果未设置此类处理程序,则线程的 ThreadGroup 对象充当其处理程序。

参数:

参数名称 参数描述
eh 用作此线程的未捕获异常处理程序的对象。 如果为 null,则此线程没有显式处理程序。

Throws:

Throw名称 Throw描述
SecurityException 如果当前线程不允许修改这个线程。