Module java.base
Package java.lang

Class Thread

java.lang.Object
java.lang.Thread
所有已实现的接口:
Runnable
直接已知的子类:
ForkJoinWorkerThread

public class Thread extends Object implements Runnable
一个线程是程序中的执行线程。Java虚拟机允许应用程序同时运行多个执行线程。

Thread定义了构造函数和一个Thread.Builder来创建线程。启动一个线程会安排它执行其run方法。新启动的线程与导致其启动的线程并发执行。

如果线程的run方法正常完成,或者如果线程的run方法异常完成并且适当的未捕获异常处理程序正常或异常完成,线程将终止。没有剩余的代码可运行时,线程已完成执行。可以使用join方法等待线程终止。

线程具有唯一的标识符和一个名称。标识符在创建Thread时生成,不能更改。线程名称可以在创建线程时指定,也可以在以后的某个时间更改

线程支持ThreadLocal变量。这些变量是线程本地的,意味着线程可以拥有一个变量的副本,其值独立于其他线程设置的值。Thread还支持InheritableThreadLocal变量,这些是在线程创建时从父Thread继承的线程本地变量。Thread支持一个特殊的可继承线程本地变量,用于线程上下文类加载器

平台线程

Thread支持创建平台线程,这些线程通常与由操作系统调度的内核线程1:1映射。平台线程通常具有由操作系统维护的大堆栈和其他资源。平台线程适合执行所有类型的任务,但可能是有限的资源。

平台线程默认会获得自动生成的线程名称。

平台线程被指定为守护线程或非守护线程。当Java虚拟机启动时,通常会有一个非守护线程(通常调用应用程序的main方法的线程)。关闭序列在所有已启动的非守护线程终止时开始。未启动的非守护线程不会阻止关闭序列的开始。

除了守护状态,平台线程还具有线程优先级并且是线程组的成员。

虚拟线程

Thread还支持创建虚拟线程。虚拟线程通常是由Java运行时而不是操作系统调度的用户模式线程。虚拟线程通常需要很少的资源,单个Java虚拟机可能支持数百万个虚拟线程。虚拟线程适合执行大部分时间被阻塞的任务,通常是等待I/O操作完成。虚拟线程不适用于长时间运行的CPU密集型操作。

虚拟线程通常使用一小组作为载体线程的平台线程。锁定和I/O操作是载体线程可能从一个虚拟线程重新调度到另一个虚拟线程的操作示例。在虚拟线程中执行的代码不知道底层载体线程。用于获取对当前线程的引用的currentThread()方法将始终返回虚拟线程的Thread对象。

虚拟线程默认没有线程名称。如果未设置线程名称,则getName方法将返回空字符串。

虚拟线程是守护线程,因此不会阻止关闭序列的开始。虚拟线程具有固定的线程优先级,不能更改。

创建和启动线程

Thread定义了用于创建平台线程和使用start方法安排线程执行的公共构造函数。尽管大多数应用程序应该很少需要这样做,但Thread可以扩展以进行自定义和其他高级操作。

Thread为创建和启动平台线程和虚拟线程定义了Thread.Builder API。以下是使用构建器的示例:

  Runnable runnable = ...

  // 启动一个守护线程来运行任务
  Thread thread = Thread.ofPlatform().daemon().start(runnable);

  // 创建一个未启动的线程,名称为"duke",必须调用其start()方法来安排执行。
  Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable);

  // 创建一个创建名为"worker-0"、"worker-1"等守护线程的ThreadFactory
  ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory();

  // 启动一个虚拟线程来运行任务
  Thread thread = Thread.ofVirtual().start(runnable);

  // 创建虚拟线程的ThreadFactory
  ThreadFactory factory = Thread.ofVirtual().factory();

创建线程时的继承

Thread从父线程在创建子Thread时的初始值继承可继承线程本地变量(包括上下文类加载器)。可以使用5参数的构造函数创建一个不从构造线程继承初始值的线程。在使用Thread.Builder时,可以使用inheritInheritableThreadLocals方法选择是否继承初始值。

平台线程继承守护状态、线程优先级,以及在未提供(或未被安全管理器选择)时的线程组。

创建平台线程捕获调用者上下文以限制新线程执行执行执行特权操作时的权限。捕获的调用者上下文是新线程的“继承的AccessControlContext”。创建虚拟线程不会捕获调用者上下文;执行执行执行特权操作时,虚拟线程没有权限。

除非另有说明,在此类中将null参数传递给构造函数或方法将导致抛出NullPointerException

实现注意事项:
在JDK参考实现中,虚拟线程调度程序可以通过以下系统属性进行配置:
系统属性
系统属性 描述
jdk.virtualThreadScheduler.parallelism 用于调度虚拟线程的可用平台线程数。默认为可用处理器的数量。
jdk.virtualThreadScheduler.maxPoolSize 调度程序可用的平台线程的最大数量。默认为256。
自版本:
1.0
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static interface 
    用于ThreadThreadFactory对象的构建器。
    static enum 
    线程状态。
    static interface 
    Thread由于未捕获异常而突然终止时调用处理程序的接口。
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    线程可以具有的最大优先级。
    static final int
    线程可以具有的最小优先级。
    static final int
    分配给线程的默认优先级。
  • Constructor Summary

    Constructors
    Constructor
    Description
    Thread()
    初始化一个新的平台Thread
    Thread(Runnable task)
    初始化一个新的平台Thread
    Thread(Runnable task, String name)
    初始化一个新的平台Thread
    Thread(String name)
    初始化一个新的平台Thread
    Thread(ThreadGroup group, Runnable task)
    初始化一个新的平台Thread
    Thread(ThreadGroup group, Runnable task, String name)
    初始化一个新的平台Thread,使其具有task作为其运行对象,具有指定的name作为其名称,并属于由group引用的线程组。
    Thread(ThreadGroup group, Runnable task, String name, long stackSize)
    初始化一个新的平台Thread,使其具有task作为其运行对象,具有指定的name作为其名称,并属于由group引用的线程组,并具有指定的堆栈大小
    Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
    初始化一个新的平台Thread,使其具有task作为其运行对象,具有指定的name作为其名称,属于由group引用的线程组,具有指定的stackSize,并且如果inheritThreadLocalstrue,则继承可继承线程本地变量的初始值。
    Thread(ThreadGroup group, String name)
    初始化一个新的平台Thread
  • Method Summary

    Modifier and Type
    Method
    Description
    static int
    返回当前线程的线程组及其子组中活动平台线程数量的估计。
    final void
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    此方法仅在与已弃用且可能在将来的版本中被移除的安全管理器一起使用时才有用。
    protected Object
    clone()
    抛出CloneNotSupportedException,因为线程无法有意义地克隆。
    int
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    此方法最初设计用于计算堆栈帧的数量,但结果从未被明确定义,并且取决于线程暂停。
    static Thread
    返回当前线程的线程对象。
    static void
    将当前线程的堆栈跟踪打印到标准错误流。
    static int
    enumerate(Thread[] tarray)
    将当前线程的线程组及其子组中的每个活动平台线程复制到指定的数组中。
    返回所有活动平台线程的堆栈跟踪映射。
    返回此线程的上下文ClassLoader
    返回线程由于未捕获异常而突然终止时调用的默认处理程序。
    long
    getId()
    已弃用。
    此方法不是最终方法,可能被覆盖以返回非线程ID的值。
    final String
    返回此线程的名称。
    final int
    返回此线程的优先级。
    返回表示此线程堆栈转储的堆栈跟踪元素数组。
    返回此线程的状态。
    final ThreadGroup
    返回线程的线程组,如果线程已终止,则返回null
    返回线程由于未捕获异常而突然终止时调用的处理程序。
    static boolean
    仅当当前线程持有指定对象的监视器锁时才返回true
    void
    中断此线程。
    static boolean
    测试当前线程是否已被中断。
    final boolean
    测试此线程是否存活。
    final boolean
    测试此线程是否为守护线程。
    boolean
    测试此线程是否已被中断。
    final boolean
    如果此线程是虚拟线程,则返回true
    final void
    join()
    等待此线程终止。
    final void
    join(long millis)
    最多等待millis毫秒,直到此线程终止。
    final void
    join(long millis, int nanos)
    最多等待millis毫秒加上nanos纳秒,直到此线程终止。
    final boolean
    join(Duration duration)
    等待此线程在给定的等待持续时间内终止。
    返回用于创建平台ThreadThreadFactory的构建器,该构建器创建平台线程。
    返回用于创建虚拟ThreadThreadFactory的构建器,该构建器创建虚拟线程。
    static void
    表示调用者暂时无法继续,直到其他活动执行某个或多个操作。
    final void
    resume()
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    此方法最初指定用于恢复使用suspend()暂停的线程。
    void
    run()
    当线程执行时,此方法由线程运行。
    void
    为此线程设置上下文ClassLoader
    final void
    setDaemon(boolean on)
    将此线程标记为守护线程或非守护线程。
    static void
    设置当线程由于未捕获异常而突然终止时调用的默认处理程序,并且未为该线程定义其他处理程序。
    final void
    setName(String name)
    将此线程的名称更改为与参数name相等。
    final void
    setPriority(int newPriority)
    更改此线程的优先级。
    void
    设置当此线程由于未捕获异常而突然终止时调用的处理程序。
    static void
    sleep(long millis)
    使当前执行的线程暂停(临时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。
    static void
    sleep(long millis, int nanos)
    使当前执行的线程暂停(临时停止执行)指定的毫秒数加上指定的纳秒数,取决于系统计时器和调度程序的精度和准确性。
    static void
    sleep(Duration duration)
    使当前执行的线程暂停(临时停止执行)指定的持续时间,取决于系统计时器和调度程序的精度和准确性。
    void
    start()
    将此线程安排开始执行。
    static Thread
    创建一个虚拟线程来执行任务并安排其执行。
    final void
    stop()
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    此方法最初指定通过使受影响的线程抛出ThreadDeath来“停止”受影响的线程。
    final void
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    此方法最初指定暂停线程。
    final long
    返回此线程的标识符。
    返回此线程的字符串表示形式。
    static void
    yield()
    向调度程序发出提示,表明当前线程愿意放弃对处理器的当前使用权。

    Methods declared in class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Field Details

    • MIN_PRIORITY

      public static final int MIN_PRIORITY
      线程可以具有的最低优先级。
      参见:
    • NORM_PRIORITY

      public static final int NORM_PRIORITY
      分配给线程的默认优先级。
      参见:
    • MAX_PRIORITY

      public static final int MAX_PRIORITY
      线程可以具有的最高优先级。
      参见:
  • Constructor Details

    • Thread

      public Thread()
      初始化一个新的平台Thread。此构造函数的效果与Thread(null, null, gname)相同,其中gname是一个新生成的名称。自动生成的名称的形式为"Thread-"+n,其中n是一个整数。

      当扩展Thread以覆盖run()方法时,此构造函数才有用。

      参见:
    • Thread

      public Thread(Runnable task)
      初始化一个新的平台Thread。此构造函数的效果与Thread(null, task, gname)相同,其中gname是一个新生成的名称。自动生成的名称的形式为"Thread-"+n,其中n是一个整数。

      对于非空任务,直接调用此构造函数等效于:

      Thread.ofPlatform().unstarted(task); 
      参数:
      task - 当启动此线程时调用其run方法的对象。如果为null,则此类的run方法不执行任何操作。
      参见:
    • Thread

      public Thread(ThreadGroup group, Runnable task)
      初始化一个新的平台Thread。此构造函数的效果与Thread(group, task, gname)相同,其中gname是一个新生成的名称。自动生成的名称的形式为"Thread-"+n,其中n是一个整数。

      对于非空组和任务,直接调用此构造函数等效于:

      Thread.ofPlatform().group(group).unstarted(task); 
      参数:
      group - 线程组。如果为null且存在安全管理器,则线程组由SecurityManager.getThreadGroup()确定。如果没有安全管理器或 SecurityManager.getThreadGroup()返回null,则将组设置为当前线程的线程组。
      task - 当启动此线程时调用其run方法的对象。如果为null,则调用此线程的run方法。
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程
      参见:
    • Thread

      public Thread(String name)
      初始化一个新的平台Thread。此构造函数的效果与Thread(null, null, name)相同。

      当扩展Thread以覆盖run()方法时,此构造函数才有用。

      参数:
      name - 新线程的名称
      参见:
    • Thread

      public Thread(ThreadGroup group, String name)
      初始化一个新的平台Thread。此构造函数的效果与Thread(group, null, name)相同。

      当扩展Thread以覆盖run()方法时,此构造函数才有用。

      参数:
      group - 线程组。如果为null并且存在安全管理器,则线程组由SecurityManager.getThreadGroup()确定。如果没有安全管理器或 SecurityManager.getThreadGroup()返回null,则将线程组设置为当前线程的线程组。
      name - 新线程的名称
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程
      参见:
    • Thread

      public Thread(Runnable task, String name)
      初始化一个新的平台Thread。此构造函数的效果与Thread (null, task, name)相同。

      对于非空的任务和名称,直接调用此构造函数等效于:

      Thread.ofPlatform().name(name).unstarted(task); 
      参数:
      task - 当启动此线程时调用其run方法的对象。如果为null,则调用此线程的run方法。
      name - 新线程的名称
      参见:
    • Thread

      public Thread(ThreadGroup group, Runnable task, String name)
      初始化一个新的平台Thread,使其具有task作为其运行对象,具有指定的name作为其名称,并属于由group引用的线程组。

      如果存在安全管理器,则将以ThreadGroup作为参数调用其checkAccess方法。

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

      新创建线程的优先级是创建它的线程的优先级和线程组的最大允许优先级中较小的那个。可以使用方法setPriority来将优先级更改为新值。

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

      对于非空的组、任务和名称,直接调用此构造函数等效于:

      Thread.ofPlatform().group(group).name(name).unstarted(task); 
      参数:
      group - 线程组。如果为null并且存在安全管理器,则线程组由SecurityManager.getThreadGroup()确定。如果没有安全管理器或 SecurityManager.getThreadGroup()返回null,则将线程组设置为当前线程的线程组。
      task - 当启动此线程时调用其run方法的对象。如果为null,则调用此线程的run方法。
      name - 新线程的名称
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程或无法覆盖上下文类加载器方法。
      参见:
    • Thread

      public Thread(ThreadGroup group, Runnable task, String name, long stackSize)
      初始化一个新的平台Thread,使其具有task作为其运行对象,具有指定的name作为其名称,并属于由group引用的线程组,并具有指定的堆栈大小

      此构造函数与Thread(ThreadGroup,Runnable,String)相同,唯一的区别在于允许指定线程堆栈大小。堆栈大小是虚拟机为此线程的堆栈分配的地址空间的大致字节数。 如果有的话,stackSize参数的影响高度依赖于平台。

      在某些平台上,为stackSize参数指定较高的值可能允许线程在抛出StackOverflowError之前实现更大的递归深度。同样,指定较低的值可能允许更多的线程同时存在而不会抛出OutOfMemoryError(或其他内部错误)。 关于stackSize参数的值与最大递归深度和并发级别之间的关系的详细信息取决于平台。

      虚拟机可以将stackSize参数视为建议。如果指定的值对于平台来说过低,虚拟机可能会使用某些特定于平台的最小值;如果指定的值过高,虚拟机可能会使用某些特定于平台的最大值。同样,虚拟机可以自由地将指定的值向上或向下舍入(或完全忽略它)。

      stackSize参数指定值为零将导致此构造函数的行为与Thread(ThreadGroup, Runnable, String)构造函数完全相同。

      由于此构造函数行为的依赖于平台的特性,因此在使用时应极度小心。执行给定计算所需的线程堆栈大小可能会因JRE实现的不同而异。鉴于这种变化,可能需要对堆栈大小参数进行仔细调整,并且可能需要针对应用程序将在其上运行的每个JRE实现重复调整。

      实现注意事项:鼓励Java平台实现者记录其实现与stackSize参数相关的行为。

      对于非空的组、任务、名称和堆栈大小,直接调用此构造函数等效于:

      Thread.ofPlatform().group(group).name(name).stackSize(stackSize).unstarted(task); 
      参数:
      group - 线程组。如果为null并且存在安全管理器,则线程组由SecurityManager.getThreadGroup()确定。如果没有安全管理器或 SecurityManager.getThreadGroup()返回null,则将线程组设置为当前线程的线程组。
      task - 当启动此线程时调用其run方法的对象。如果为null,则调用此线程的run方法。
      name - 新线程的名称
      stackSize - 新线程的期望堆栈大小,或零表示忽略此参数。
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程
      自1.4起
      参见:
    • Thread

      public Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
      初始化一个新的平台Thread,使其具有task作为其运行对象,具有指定的name作为其名称,属于由group引用的线程组,具有指定的stackSize,并且如果inheritThreadLocalstrue,则继承trueinheritable thread-local变量的初始值。

      此构造函数与Thread(ThreadGroup,Runnable,String,long)相同,只是增加了对是否从构造线程继承可继承线程本地变量的初始值的抑制或不抑制的能力。这允许对可继承线程本地变量进行更精细的控制。如果将false的值传递给inheritThreadLocals,则在新线程执行期望从特定线程本地值继承的代码时可能会导致意外行为,因此必须小心使用。

      inheritThreadLocals参数指定值为true将导致此构造函数的行为与Thread(ThreadGroup, Runnable, String, long)构造函数完全相同。

      对于非空的组、任务、名称和堆栈大小,直接调用此构造函数等效于:

      Thread.ofPlatform()
            .group(group)
            .name(name)
            .stackSize(stackSize)
            .inheritInheritableThreadLocals(inheritInheritableThreadLocals)
            .unstarted(task); 
      参数:
      group - 线程组。如果为null并且存在安全管理器,则线程组由SecurityManager.getThreadGroup()确定。如果没有安全管理器或 SecurityManager.getThreadGroup()返回null,则将线程组设置为当前线程的线程组。
      task - 当启动此线程时调用其run方法的对象。如果为null,则调用此线程的run方法。
      name - 新线程的名称
      stackSize - 新线程的期望堆栈大小,或零表示忽略此参数
      inheritInheritableThreadLocals - 如果为true,则从构造线程继承可继承线程本地变量的初始值,否则不继承任何初始值
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程
      自9起
      参见:
  • Method Details

    • currentThread

      public static Thread currentThread()
      返回当前线程的Thread对象。
      返回:
      当前线程
    • yield

      public static void yield()
      调度程序的提示,当前线程愿意放弃当前对处理器的使用。调度程序可以忽略此提示。

      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 - 如果任何线程中断了当前线程。抛出此异常时,当前线程的“中断状态”将被清除。
    • sleep

      public static void sleep(Duration duration) throws InterruptedException
      使当前执行的线程休眠(暂时停止执行)指定的持续时间,取决于系统计时器和调度程序的精度和准确性。如果持续时间为负数,则此方法不执行任何操作。
      参数:
      duration - 休眠的持续时间
      抛出:
      InterruptedException - 如果当前线程在休眠时被中断。抛出此异常时,当前线程的“中断状态”将被清除。
      自版本:
      19
    • onSpinWait

      public static void onSpinWait()
      表示调用者暂时无法继续,直到其他活动的一个或多个动作发生。通过在自旋等待循环结构的每次迭代中调用此方法,调用线程向运行时指示它正在忙等待。运行时可能会采取行动来改善调用自旋等待循环结构的性能。
      API注释:
      例如,考虑一个类中的一个方法,在该方法中自旋循环直到在该方法之外设置了某个标志。应在自旋循环中放置对onSpinWait方法的调用。
          class EventHandler {
              volatile boolean eventNotificationNotReceived;
              void waitForEventAndHandleIt() {
                  while ( eventNotificationNotReceived ) {
                      Thread.onSpinWait();
                  }
                  readAndProcessEvent();
              }
      
              void readAndProcessEvent() {
                  // 从某个源读取事件并处理
                   . . .
              }
          }
      

      即使未调用onSpinWait方法,上述代码仍然是正确的。但是在某些体系结构上,Java虚拟机可能会发出处理此类代码模式的处理器指令,以更有利的方式处理。

      自版本:
      9
    • ofPlatform

      public static Thread.Builder.OfPlatform ofPlatform()
      返回一个构建器,用于创建平台Thread或创建平台线程的ThreadFactory

      创建平台线程时与安全管理器的交互

      在设置了安全管理器时创建平台线程将调用安全管理器的checkAccess(ThreadGroup)方法,并将线程的线程组作为参数传递。如果线程组未使用OfPlatform.group方法设置,则首先将调用安全管理器的getThreadGroup方法来选择线程组。如果安全管理器的getThreadGroup方法返回null,则使用构造线程的线程组。

      API注释:
      以下是使用构建器的示例:
        // 启动一个后台线程来运行任务
        Thread thread = Thread.ofPlatform().daemon().start(runnable);
      
        // 创建一个未启动的名为“duke”的线程,必须调用其start()方法以安排执行。
        Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable);
      
        // 创建一个创建名为“worker-0”、“worker-1”等的后台线程的ThreadFactory
        ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory();
      
      返回:
      用于创建ThreadThreadFactory对象的构建器。
      自版本:
      21
    • ofVirtual

      public static Thread.Builder.OfVirtual ofVirtual()
      返回一个构建器,用于创建虚拟Thread或创建虚拟线程的ThreadFactory
      API注释:
      以下是使用构建器的示例:
        // 启动一个虚拟线程来运行任务。
        Thread thread = Thread.ofVirtual().start(runnable);
      
        // 创建一个创建虚拟线程的ThreadFactory
        ThreadFactory factory = Thread.ofVirtual().factory();
      
      返回:
      用于创建ThreadThreadFactory对象的构建器。
      自版本:
      21
    • clone

      protected Object clone() throws CloneNotSupportedException
      抛出CloneNotSupportedException,因为Thread无法有实际意义上的克隆。请构造一个新的Thread。
      覆盖:
      clone 在类 Object
      返回:
      此实例的克隆。
      抛出:
      CloneNotSupportedException - 总是
      另请参阅:
    • startVirtualThread

      public static Thread startVirtualThread(Runnable task)
      创建一个虚拟线程来执行任务并安排其执行。

      此方法等效于:

      Thread.ofVirtual().start(task); 
      参数:
      task - 线程执行时要运行的对象
      返回:
      一个新的、已启动的虚拟线程
      自版本:
      21
      另请参阅:
    • isVirtual

      public final boolean isVirtual()
      如果此线程是虚拟线程,则返回true。虚拟线程由Java虚拟机而不是操作系统调度。
      返回:
      如果此线程是虚拟线程,则返回true
      自版本:
      21
    • start

      public void start()
      安排此线程开始执行。该线程将独立于当前线程执行。

      一个线程最多可以启动一次。特别地,线程在终止后无法重新启动。

      抛出:
      IllegalThreadStateException - 如果线程已经启动
    • run

      public void run()
      当线程执行时,此方法由线程运行。Thread的子类可以重写此方法。

      此方法不应直接调用。如果此线程是使用Runnable任务创建的平台线程,则调用此方法将调用任务的run方法。如果此线程是虚拟线程,则直接调用此方法不会执行任何操作。

      指定者:
      run 在接口 Runnable
      实现要求:
      默认实现执行创建Thread时使用的Runnable任务。如果线程是在没有任务的情况下创建的,则此方法不执行任何操作。
    • stop

      @Deprecated(since="1.2", forRemoval=true) public final void stop()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method was originally specified to "stop" a victim thread by causing the victim thread to throw a ThreadDeath. It was inherently unsafe. Stopping a thread caused it to unlock all of the monitors that it had locked (as a natural consequence of the ThreadDeath exception propagating up the stack). If any of the objects previously protected by these monitors were in an inconsistent state, the damaged objects became visible to other threads, potentially resulting in arbitrary behavior. Usages of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. If the target thread waits for long periods (on a condition variable, for example), the interrupt method should be used to interrupt the wait. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
      抛出UnsupportedOperationException
      抛出:
      UnsupportedOperationException - 总是
    • interrupt

      public void interrupt()
      中断此线程。

      除非当前线程正在中断自身(这是始终允许的),否则将调用此线程的checkAccess方法,这可能会导致抛出SecurityException

      如果此线程在调用Object类的wait()wait(long)wait(long, int)方法,或者在此类的join()join(long)join(long, int)sleep(long)sleep(long, int)方法中被阻塞,那么它的中断状态将被清除,并且它将收到InterruptedException

      如果此线程在对InterruptibleChannel进行I/O操作时被阻塞,则通道将被关闭,线程的中断状态将被设置,并且线程将收到ClosedByInterruptException

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

      如果上述条件都不满足,则将设置此线程的中断状态。

      中断非活动线程可能不会产生任何效果。

      实现注意事项:
      在JDK参考实现中,中断一个非活动线程仍会记录中断请求已经发出,并将通过interrupted()isInterrupted()进行报告。
      抛出:
      SecurityException - 如果当前线程无法修改此线程
    • interrupted

      public static boolean interrupted()
      测试当前线程是否已被中断。此方法将清除线程的中断状态。换句话说,如果连续两次调用此方法,第二次调用将返回false(除非在第一次调用清除其中断状态之后,当前线程再次被中断,而在第二次调用之前检查了它)。
      返回:
      如果当前线程已被中断,则返回true;否则返回false
      参见:
    • isInterrupted

      public boolean isInterrupted()
      测试此线程是否已被中断。此方法不会影响线程的中断状态
      返回:
      如果此线程已被中断,则返回true;否则返回false
      参见:
    • isAlive

      public final boolean isAlive()
      测试此线程是否存活。如果线程已启动且尚未终止,则线程是存活的。
      返回:
      如果此线程存活,则返回true;否则返回false
    • suspend

      @Deprecated(since="1.2", forRemoval=true) public final void suspend()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method was originally specified to suspend a thread. It was inherently deadlock-prone. If the target thread held a lock on a monitor protecting a critical system resource when it was suspended, no thread could access the resource until the target thread was resumed. If the thread intending to resume the target thread attempted to lock the monitor prior to calling resume, deadlock would result. Such deadlocks typically manifested themselves as "frozen" processes. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
      抛出UnsupportedOperationException
      抛出:
      UnsupportedOperationException - 总是抛出
    • resume

      @Deprecated(since="1.2", forRemoval=true) public final void resume()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method was originally specified to resume a thread suspended with suspend(). Suspending a thread was inherently deadlock-prone. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
      抛出UnsupportedOperationException
      抛出:
      UnsupportedOperationException - 总是抛出
    • setPriority

      public final void setPriority(int newPriority)
      更改此线程的优先级。对于平台线程,优先级设置为指定newPriority和线程组的最大允许优先级中的较小者。虚拟线程的优先级始终为NORM_PRIORITY,并且将忽略newPriority
      参数:
      newPriority - 新线程优先级
      抛出:
      IllegalArgumentException - 如果优先级不在MIN_PRIORITYMAX_PRIORITY范围内。
      SecurityException - 如果checkAccess()确定当前线程无法修改此线程
      参见:
    • getPriority

      public final int getPriority()
      返回此线程的优先级。

      虚拟线程的优先级始终为NORM_PRIORITY

      返回:
      此线程的优先级。
      参见:
    • setName

      public final void setName(String name)
      将此线程的名称更改为参数name相等的名称。

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

      实现注意事项:
      在JDK参考实现中,如果此线程是当前线程,并且它是未使用Java本机接口的AttachCurrentThread函数附加到VM的平台线程,则此方法将设置操作系统线程名称。这可能对调试和故障排除有用。
      参数:
      name - 此线程的新名称。
      抛出:
      SecurityException - 如果当前线程无法修改此线程。
      外部规范
      参见:
    • getName

      public final String getName()
      返回此线程的名称。
      返回:
      此线程的名称。
      参见:
    • getThreadGroup

      public final ThreadGroup getThreadGroup()
      返回线程的线程组,如果线程已终止则返回null

      虚拟线程的线程组是特殊的虚拟线程的线程组

      返回:
      此线程的线程组或null
    • activeCount

      public static int activeCount()
      返回当前线程的线程组及其子组中的live平台线程数量的估计值。估计返回的值仅供参考,因为线程数量可能在此方法遍历内部数据结构时动态更改,并且可能受到某些系统线程的影响。此方法主要用于调试和监视目的。
      返回:
      当前线程的线程组及其任何其他线程组中的live平台线程数量的估计值
    • enumerate

      public static int enumerate(Thread[] tarray)
      将当前线程的线程组及其子组中的每个live平台线程复制到指定的数组中。此方法只是调用当前线程的线程组的ThreadGroup.enumerate(Thread[])方法。此方法不会枚举虚拟线程。

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

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

      参数:
      tarray - 用于放置线程列表的数组
      返回:
      放入数组的线程数
      抛出:
      SecurityException - 如果ThreadGroup.checkAccess()确定当前线程无法访问其线程组
    • countStackFrames

      @Deprecated(since="1.2", forRemoval=true) public int countStackFrames()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method was originally designed to count the number of stack frames but the results were never well-defined and it depended on thread-suspension. This method is subject to removal in a future version of Java SE.
      抛出UnsupportedOperationException
      返回:
      参见:
    • join

      public final void join(long millis) throws InterruptedException
      等待最多millis毫秒,以使此线程终止。超时0表示永远等待。如果线程尚未start(),则此方法将立即返回,而不会等待。
      实现注意事项:
      对于平台线程,实现使用了一个基于this.wait调用的循环,条件是this.isAlive。当线程终止时,会调用this.notifyAll方法。建议应用程序不要在Thread实例上使用waitnotifynotifyAll
      参数:
      millis - 等待的时间(毫秒)
      抛出:
      IllegalArgumentException - 如果millis的值为负数
      InterruptedException - 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除。
    • join

      public final void join(long millis, int nanos) throws InterruptedException
      等待最多millis毫秒加上nanos纳秒,以使此线程终止。如果两个参数都是0,则表示永久等待。如果线程尚未启动,则此方法立即返回,而不等待。
      实现注意事项:
      对于平台线程,实现使用了一个基于this.wait调用的循环,条件是this.isAlive。当线程终止时,会调用this.notifyAll方法。建议应用程序不要在Thread实例上使用waitnotifynotifyAll
      参数:
      millis - 等待的时间(毫秒)
      nanos - 0-999999额外的纳秒等待时间
      抛出:
      IllegalArgumentException - 如果millis的值为负数,或者nanos的值不在范围0-999999
      InterruptedException - 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除。
    • join

      public final void join() throws InterruptedException
      等待此线程终止。

      调用此方法的行为与调用

      join(0)
      完全相同。
      抛出:
      InterruptedException - 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除。
    • join

      public final boolean join(Duration duration) throws InterruptedException
      等待此线程终止,最多等待给定的等待时间。

      如果等待时间小于或等于零,则此方法不会等待。在这种情况下,该方法只是测试线程是否已终止。

      参数:
      duration - 等待的最长持续时间
      返回:
      如果线程已终止,则返回true,如果线程尚未终止,则返回false
      抛出:
      InterruptedException - 如果当前线程在等待时被中断。当抛出此异常时,当前线程的中断状态将被清除。
      IllegalThreadStateException - 如果此线程尚未启动。
      自:
      19
    • dumpStack

      public static void dumpStack()
      将当前线程的堆栈跟踪打印到标准错误流。此方法对调试很有用。
    • setDaemon

      public final void setDaemon(boolean on)
      将此线程标记为守护线程或非守护线程。当所有已启动的非守护线程终止时,关闭序列将开始。

      虚拟线程的守护状态始终为true,无法通过此方法更改为false

      此方法必须在线程启动之前调用。线程终止后调用此方法的行为未指定。

      参数:
      on - 如果为true,将此线程标记为守护线程
      抛出:
      IllegalArgumentException - 如果这是一个虚拟线程且on为false
      IllegalThreadStateException - 如果此线程是活动的
      SecurityException - 如果checkAccess()确定当前线程无法修改此线程
    • isDaemon

      public final boolean isDaemon()
      测试此线程是否为守护线程。虚拟线程的守护状态始终为true
      返回:
      如果此线程是守护线程,则返回true;否则返回false
      参见:
    • checkAccess

      @Deprecated(since="17", forRemoval=true) public final void checkAccess()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method is only useful in conjunction with the Security Manager, which is deprecated and subject to removal in a future release. Consequently, this method is also deprecated and subject to removal. There is no replacement for the Security Manager or this method.
      确定当前运行的线程是否有权限修改此线程。

      如果存在安全管理器,则将以此线程作为参数调用其checkAccess方法。这可能导致抛出SecurityException

      抛出:
      SecurityException - 如果当前线程不允许访问此线程。
      参见:
    • toString

      public String toString()
      返回此线程的字符串表示形式。字符串表示通常包括线程的标识符和名称。对于平台线程的默认实现包括线程的标识符、名称、优先级和线程组的名称。
      覆盖:
      toString 在类 Object
      返回:
      此线程的字符串表示形式。
    • getContextClassLoader

      public ClassLoader getContextClassLoader()
      返回此线程的上下文ClassLoader。线程的创建者可以为此线程设置上下文ClassLoader,以便在此线程中运行的代码在加载类和资源时使用。如果未设置,则默认情况下会从父线程继承上下文类加载器。

      原始线程的上下文ClassLoader通常设置为用于加载应用程序的类加载器。

      返回:
      此线程的上下文ClassLoader,或null表示系统类加载器(或者,如果没有,则表示引导类加载器)
      抛出:
      SecurityException - 如果存在安全管理器,并且调用者的类加载器不为null且不同于上下文类加载器或其祖先,并且调用者没有RuntimePermission("getClassLoader")
      自:
      1.2
    • setContextClassLoader

      public void setContextClassLoader(ClassLoader cl)
      为此线程设置上下文ClassLoader

      线程的创建者可以为此线程设置上下文ClassLoader,以便在此线程中运行的代码在加载类和资源时使用。

      如果存在安全管理器,则将调用其checkPermission方法,以RuntimePermission("setContextClassLoader")权限检查是否允许设置上下文类加载器。

      参数:
      cl - 用于此线程的上下文类加载器,或者为null表示系统类加载器(或者,如果没有,则表示引导类加载器)
      抛出:
      SecurityException - 如果当前线程无法设置上下文类加载器
      自:
      1.2
    • holdsLock

      public static boolean holdsLock(Object obj)
      当前线程是否持有指定对象的监视器锁时返回true

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

           assert Thread.holdsLock(obj);
       
      参数:
      obj - 要测试锁所有权的对象
      返回:
      如果当前线程持有指定对象的监视器锁,则返回true
      自:
      1.4
    • getStackTrace

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

      如果存在安全管理器,并且此线程不是当前线程,则将调用安全管理器的checkPermission方法,使用RuntimePermission("getStackTrace")权限检查是否可以获取堆栈跟踪。

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

      返回:
      一个StackTraceElement数组,每个元素表示一个堆栈帧。
      抛出:
      SecurityException - 如果存在安全管理器,并且其checkPermission方法不允许获取线程的堆栈跟踪。
      自:
      1.5
      参见:
    • getAllStackTraces

      public static Map<Thread,StackTraceElement[]> getAllStackTraces()
      返回所有活动平台线程的堆栈跟踪映射。该映射不包括虚拟线程。映射的键是线程,每个映射值是一个StackTraceElement数组,表示相应Thread的堆栈转储。返回的堆栈跟踪采用getStackTrace方法指定的格式。

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

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

      返回:
      Thread到表示相应线程堆栈跟踪的StackTraceElement数组的Map
      抛出:
      SecurityException - 如果存在安全管理器并且其checkPermission方法不允许获取线程的堆栈跟踪。
      自:
      1.5
      参见:
    • getId

      @Deprecated(since="19") public long getId()
      Deprecated.
      This method is not final and may be overridden to return a value that is not the thread ID. Use threadId() instead.
      返回此线程的标识符。线程ID是在创建此线程时生成的正数long数。线程ID是唯一的,在其生命周期内保持不变。
      返回:
      此线程的ID
      自:
      1.5
    • threadId

      public final long threadId()
      返回此线程的标识符。线程ID是在创建此线程时生成的正数long数。线程ID是唯一的,在其生命周期内保持不变。
      返回:
      此线程的ID
      自:
      19
    • getState

      public Thread.State getState()
      返回此线程的状态。此方法设计用于监视系统状态,而不是用于同步控制。
      返回:
      此线程的状态。
      自:
      1.5
    • setDefaultUncaughtExceptionHandler

      public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
      设置当线程因未捕获异常突然终止且没有为该线程定义其他处理程序时调用的默认处理程序。

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

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

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

      参数:
      ueh - 用作默认未捕获异常处理程序的对象。如果为null,则没有默认处理程序。
      抛出:
      SecurityException - 如果存在安全管理器并且拒绝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 ueh)
      设置当此线程因未捕获异常突然终止时调用的处理程序。

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

      参数:
      ueh - 用作此线程的未捕获异常处理程序的对象。如果为null,则此线程没有显式处理程序。
      抛出:
      SecurityException - 如果当前线程不允许修改此线程。
      自:
      1.5
      参见: