- 所有已实现的接口:
-
Runnable
- 直接已知的子类:
-
ForkJoinWorkerThread
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 ClassesModifier and TypeClassDescriptionstatic interface
用于Thread
和ThreadFactory
对象的构建器。static enum
线程状态。static interface
当Thread
由于未捕获异常而突然终止时调用处理程序的接口。 -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
线程可以具有的最大优先级。static final int
线程可以具有的最小优先级。static final int
分配给线程的默认优先级。 -
Constructor Summary
ConstructorsConstructorDescriptionThread()
初始化一个新的平台Thread
。初始化一个新的平台Thread
。初始化一个新的平台Thread
。初始化一个新的平台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
,并且如果inheritThreadLocals
为true
,则继承可继承线程本地变量的初始值。Thread
(ThreadGroup group, String name) 初始化一个新的平台Thread
。 -
Method Summary
Modifier and TypeMethodDescriptionstatic int
返回当前线程的线程组及其子组中活动平台线程数量的估计。final void
已弃用,将被移除:此API元素可能在将来的版本中被移除。此方法仅在与已弃用且可能在将来的版本中被移除的安全管理器一起使用时才有用。protected Object
clone()
抛出CloneNotSupportedException,因为线程无法有意义地克隆。int
已弃用,将被移除:此API元素可能在将来的版本中被移除。此方法最初设计用于计算堆栈帧的数量,但结果从未被明确定义,并且取决于线程暂停。static Thread
返回当前线程的线程对象。static void
将当前线程的堆栈跟踪打印到标准错误流。static int
将当前线程的线程组及其子组中的每个活动平台线程复制到指定的数组中。static Map
<Thread, StackTraceElement[]> 返回所有活动平台线程的堆栈跟踪映射。返回此线程的上下文ClassLoader
。返回线程由于未捕获异常而突然终止时调用的默认处理程序。long
getId()
已弃用。此方法不是最终方法,可能被覆盖以返回非线程ID的值。final String
getName()
返回此线程的名称。final int
返回此线程的优先级。返回表示此线程堆栈转储的堆栈跟踪元素数组。getState()
返回此线程的状态。final ThreadGroup
返回线程的线程组,如果线程已终止,则返回null
。返回线程由于未捕获异常而突然终止时调用的处理程序。static boolean
仅当当前线程持有指定对象的监视器锁时才返回true
。void
中断此线程。static boolean
测试当前线程是否已被中断。final boolean
isAlive()
测试此线程是否存活。final boolean
isDaemon()
测试此线程是否为守护线程。boolean
测试此线程是否已被中断。final boolean
如果此线程是虚拟线程,则返回true
。final void
join()
等待此线程终止。final void
join
(long millis) 最多等待millis
毫秒,直到此线程终止。final void
join
(long millis, int nanos) 最多等待millis
毫秒加上nanos
纳秒,直到此线程终止。final boolean
等待此线程在给定的等待持续时间内终止。static Thread.Builder.OfPlatform
返回用于创建平台Thread
或ThreadFactory
的构建器,该构建器创建平台线程。static Thread.Builder.OfVirtual
返回用于创建虚拟Thread
或ThreadFactory
的构建器,该构建器创建虚拟线程。static void
表示调用者暂时无法继续,直到其他活动执行某个或多个操作。final void
resume()
已弃用,将被移除:此API元素可能在将来的版本中被移除。此方法最初指定用于恢复使用suspend()
暂停的线程。void
run()
当线程执行时,此方法由线程运行。void
为此线程设置上下文ClassLoader
。final void
setDaemon
(boolean on) 将此线程标记为守护线程或非守护线程。static void
设置当线程由于未捕获异常而突然终止时调用的默认处理程序,并且未为该线程定义其他处理程序。final void
将此线程的名称更改为与参数name
相等。final void
setPriority
(int newPriority) 更改此线程的优先级。void
设置当此线程由于未捕获异常而突然终止时调用的处理程序。static void
sleep
(long millis) 使当前执行的线程暂停(临时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。static void
sleep
(long millis, int nanos) 使当前执行的线程暂停(临时停止执行)指定的毫秒数加上指定的纳秒数,取决于系统计时器和调度程序的精度和准确性。static void
使当前执行的线程暂停(临时停止执行)指定的持续时间,取决于系统计时器和调度程序的精度和准确性。void
start()
将此线程安排开始执行。static Thread
startVirtualThread
(Runnable task) 创建一个虚拟线程来执行任务并安排其执行。final void
stop()
已弃用,将被移除:此API元素可能在将来的版本中被移除。此方法最初指定通过使受影响的线程抛出ThreadDeath
来“停止”受影响的线程。final void
suspend()
已弃用,将被移除:此API元素可能在将来的版本中被移除。此方法最初指定暂停线程。final long
threadId()
返回此线程的标识符。toString()
返回此线程的字符串表示形式。static void
yield()
向调度程序发出提示,表明当前线程愿意放弃对处理器的当前使用权。
-
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
初始化一个新的平台Thread
。此构造函数的效果与Thread(null, task, gname)
相同,其中gname
是一个新生成的名称。自动生成的名称的形式为"Thread-"+
n,其中n是一个整数。对于非空任务,直接调用此构造函数等效于:
Thread.ofPlatform().unstarted(task);
- 参数:
-
task
- 当启动此线程时调用其run
方法的对象。如果为null
,则此类的run
方法不执行任何操作。 - 参见:
-
Thread
初始化一个新的平台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
- 参数:
-
name
- 新线程的名称 - 参见:
-
Thread
- 参数:
-
group
- 线程组。如果为null
并且存在安全管理器,则线程组由SecurityManager.getThreadGroup()确定。如果没有安全管理器或SecurityManager.getThreadGroup()
返回null
,则将线程组设置为当前线程的线程组。 -
name
- 新线程的名称 - 抛出:
-
SecurityException
- 如果当前线程无法在指定的线程组中创建线程 - 参见:
-
Thread
初始化一个新的平台Thread
。此构造函数的效果与Thread(null, task, name)
相同。对于非空的任务和名称,直接调用此构造函数等效于:
Thread.ofPlatform().name(name).unstarted(task);
- 参数:
-
task
- 当启动此线程时调用其run
方法的对象。如果为null
,则调用此线程的run方法。 -
name
- 新线程的名称 - 参见:
-
Thread
初始化一个新的平台Thread
,使其具有task
作为其运行对象,具有指定的name
作为其名称,并属于由group
引用的线程组。如果存在安全管理器,则将以ThreadGroup作为参数调用其
checkAccess
方法。此外,当直接或间接由覆盖
getContextClassLoader
或setContextClassLoader
方法的子类的构造函数调用时,将调用其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
初始化一个新的平台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
,并且如果inheritThreadLocals
为true
,则继承true
的inheritable 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
返回当前线程的Thread对象。- 返回:
- 当前线程
-
yield
public static void yield()调度程序的提示,当前线程愿意放弃当前对处理器的使用。调度程序可以忽略此提示。Yield是一种试图改善线程之间相对进度的启发式尝试,否则这些线程会过度利用CPU。应结合详细的分析和基准测试来使用,以确保它实际产生期望的效果。
很少适合使用此方法。在调试或测试目的中可能有用,因为它有助于重现由竞争条件引起的错误。在设计诸如
java.util.concurrent.locks
包中的并发控制构造时可能也有用。 -
sleep
使当前执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。线程不会失去任何监视器的所有权。- 参数:
-
millis
- 以毫秒为单位的休眠时间长度 - 抛出:
-
IllegalArgumentException
- 如果millis
的值为负 -
InterruptedException
- 如果任何线程中断了当前线程。抛出此异常时,当前线程的“中断状态”将被清除。
-
sleep
使当前执行的线程休眠(暂时停止执行)指定的毫秒数加上指定的纳秒数,取决于系统计时器和调度程序的精度和准确性。线程不会失去任何监视器的所有权。- 参数:
-
millis
- 以毫秒为单位的休眠时间长度 -
nanos
- 休眠的额外纳秒数,范围为0-999999
- 抛出:
-
IllegalArgumentException
- 如果millis
的值为负,或者nanos
的值不在0-999999
范围内 -
InterruptedException
- 如果任何线程中断了当前线程。抛出此异常时,当前线程的“中断状态”将被清除。
-
sleep
使当前执行的线程休眠(暂时停止执行)指定的持续时间,取决于系统计时器和调度程序的精度和准确性。如果持续时间为负数,则此方法不执行任何操作。- 参数:
-
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
返回一个构建器,用于创建平台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();
- 返回:
-
用于创建
Thread
或ThreadFactory
对象的构建器。 - 自版本:
- 21
-
ofVirtual
返回一个构建器,用于创建虚拟Thread
或创建虚拟线程的ThreadFactory
。- API注释:
-
以下是使用构建器的示例:
// 启动一个虚拟线程来运行任务。 Thread thread = Thread.ofVirtual().start(runnable); // 创建一个创建虚拟线程的ThreadFactory ThreadFactory factory = Thread.ofVirtual().factory();
- 返回:
-
用于创建
Thread
或ThreadFactory
对象的构建器。 - 自版本:
- 21
-
clone
抛出CloneNotSupportedException,因为Thread无法有实际意义上的克隆。请构造一个新的Thread。- 覆盖:
-
clone
在类Object
中 - 返回:
- 此实例的克隆。
- 抛出:
-
CloneNotSupportedException
- 总是 - 另请参阅:
-
startVirtualThread
创建一个虚拟线程来执行任务并安排其执行。此方法等效于:
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
方法。如果此线程是虚拟线程,则直接调用此方法不会执行任何操作。 -
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 aThreadDeath
. It was inherently unsafe. Stopping a thread caused it to unlock all of the monitors that it had locked (as a natural consequence of theThreadDeath
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 ofstop
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), theinterrupt
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, 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 callingresume
, 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, for removal: This API element is subject to removal in a future version.This method was originally specified to resume a thread suspended withsuspend()
. 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_PRIORITY
到MAX_PRIORITY
范围内。 -
SecurityException
- 如果checkAccess()
确定当前线程无法修改此线程 - 参见:
-
getPriority
public final int getPriority()返回此线程的优先级。虚拟线程的优先级始终为
NORM_PRIORITY
。- 返回:
- 此线程的优先级。
- 参见:
-
setName
将此线程的名称更改为参数name
相等的名称。首先调用此线程的
checkAccess
方法,不带任何参数。这可能会导致抛出SecurityException
。- 实现注意事项:
-
在JDK参考实现中,如果此线程是当前线程,并且它是未使用Java本机接口的
AttachCurrentThread
函数附加到VM的平台线程,则此方法将设置操作系统线程名称。这可能对调试和故障排除有用。 - 参数:
-
name
- 此线程的新名称。 - 抛出:
-
SecurityException
- 如果当前线程无法修改此线程。 - 外部规范
- 参见:
-
getName
返回此线程的名称。- 返回:
- 此线程的名称。
- 参见:
-
getThreadGroup
返回线程的线程组,如果线程已终止则返回null
。虚拟线程的线程组是特殊的虚拟线程的线程组。
- 返回:
-
此线程的线程组或
null
-
activeCount
public static int activeCount()返回当前线程的线程组及其子组中的live
平台线程数量的估计值。估计返回的值仅供参考,因为线程数量可能在此方法遍历内部数据结构时动态更改,并且可能受到某些系统线程的影响。此方法主要用于调试和监视目的。- 返回:
-
当前线程的线程组及其任何其他线程组中的
live
平台线程数量的估计值
-
enumerate
将当前线程的线程组及其子组中的每个live
平台线程复制到指定的数组中。此方法只是调用当前线程的线程组的ThreadGroup.enumerate(Thread[])
方法。此方法不会枚举虚拟线程。应用程序可能使用
activeCount()
方法来获取数组应该有多大的估计值,但是如果数组太短而无法容纳所有线程,则额外的线程将被静默忽略。如果关键是获取当前线程的线程组及其子组中的每个活动线程,则调用者应验证返回的int值严格小于tarray
的长度。由于此方法中存在固有的竞争条件,建议仅将该方法用于调试和监视目的。
- 参数:
-
tarray
- 用于放置线程列表的数组 - 返回:
- 放入数组的线程数
- 抛出:
-
SecurityException
- 如果ThreadGroup.checkAccess()
确定当前线程无法访问其线程组
-
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
等待最多millis
毫秒,以使此线程终止。超时0
表示永远等待。如果线程尚未start()
,则此方法将立即返回,而不会等待。- 实现注意事项:
-
对于平台线程,实现使用了一个基于
this.wait
调用的循环,条件是this.isAlive
。当线程终止时,会调用this.notifyAll
方法。建议应用程序不要在Thread
实例上使用wait
、notify
或notifyAll
。 - 参数:
-
millis
- 等待的时间(毫秒) - 抛出:
-
IllegalArgumentException
- 如果millis
的值为负数 -
InterruptedException
- 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除。
-
join
- 实现注意事项:
-
对于平台线程,实现使用了一个基于
this.wait
调用的循环,条件是this.isAlive
。当线程终止时,会调用this.notifyAll
方法。建议应用程序不要在Thread
实例上使用wait
、notify
或notifyAll
。 - 参数:
-
millis
- 等待的时间(毫秒) -
nanos
-0-999999
额外的纳秒等待时间 - 抛出:
-
IllegalArgumentException
- 如果millis
的值为负数,或者nanos
的值不在范围0-999999
内 -
InterruptedException
- 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除。
-
join
等待此线程终止。调用此方法的行为与调用
join
完全相同。(0)
- 抛出:
-
InterruptedException
- 如果任何线程中断了当前线程。当抛出此异常时,当前线程的中断状态将被清除。
-
join
等待此线程终止,最多等待给定的等待时间。如果等待时间小于或等于零,则此方法不会等待。在这种情况下,该方法只是测试线程是否已终止。
- 参数:
-
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, 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
返回此线程的字符串表示形式。字符串表示通常包括线程的标识符和名称。对于平台线程的默认实现包括线程的标识符、名称、优先级和线程组的名称。 -
getContextClassLoader
返回此线程的上下文ClassLoader
。线程的创建者可以为此线程设置上下文ClassLoader
,以便在此线程中运行的代码在加载类和资源时使用。如果未设置,则默认情况下会从父线程继承上下文类加载器。原始线程的上下文
ClassLoader
通常设置为用于加载应用程序的类加载器。- 返回:
-
此线程的上下文
ClassLoader
,或null
表示系统类加载器(或者,如果没有,则表示引导类加载器) - 抛出:
-
SecurityException
- 如果存在安全管理器,并且调用者的类加载器不为null
且不同于上下文类加载器或其祖先,并且调用者没有RuntimePermission("getClassLoader")
- 自:
- 1.2
-
setContextClassLoader
为此线程设置上下文ClassLoader
。线程的创建者可以为此线程设置上下文
ClassLoader
,以便在此线程中运行的代码在加载类和资源时使用。如果存在安全管理器,则将调用其
checkPermission
方法,以RuntimePermission("setContextClassLoader")
权限检查是否允许设置上下文类加载器。- 参数:
-
cl
- 用于此线程的上下文类加载器,或者为null表示系统类加载器(或者,如果没有,则表示引导类加载器) - 抛出:
-
SecurityException
- 如果当前线程无法设置上下文类加载器 - 自:
- 1.2
-
holdsLock
当前线程是否持有指定对象的监视器锁时返回true
。此方法旨在允许程序断言当前线程已经持有指定的锁:
assert Thread.holdsLock(obj);
- 参数:
-
obj
- 要测试锁所有权的对象 - 返回:
-
如果当前线程持有指定对象的监视器锁,则返回
true
。 - 自:
- 1.4
-
getStackTrace
返回表示此线程堆栈转储的堆栈跟踪元素数组。如果此线程尚未启动、已启动但尚未被系统调度运行,或已终止,则此方法将返回一个长度为零的数组。如果返回的数组长度不为零,则数组的第一个元素表示堆栈的顶部,即序列中最近的方法调用。数组的最后一个元素表示堆栈的底部,即序列中最早的方法调用。如果存在安全管理器,并且此线程不是当前线程,则将调用安全管理器的
checkPermission
方法,使用RuntimePermission("getStackTrace")
权限检查是否可以获取堆栈跟踪。在某些情况下,某些虚拟机可能会在堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有关于此线程的堆栈跟踪信息的虚拟机可以从此方法返回一个长度为零的数组。
- 返回:
-
一个
StackTraceElement
数组,每个元素表示一个堆栈帧。 - 抛出:
-
SecurityException
- 如果存在安全管理器,并且其checkPermission
方法不允许获取线程的堆栈跟踪。 - 自:
- 1.5
- 参见:
-
getAllStackTraces
返回所有活动平台线程的堆栈跟踪映射。该映射不包括虚拟线程。映射的键是线程,每个映射值是一个StackTraceElement
数组,表示相应Thread
的堆栈转储。返回的堆栈跟踪采用getStackTrace
方法指定的格式。在调用此方法时,线程可能正在执行。每个线程的堆栈跟踪仅表示一个快照,每个堆栈跟踪可能在不同时间获取。如果虚拟机没有关于线程的堆栈跟踪信息,则映射值将返回零长度数组。
如果存在安全管理器,则将使用
RuntimePermission("getStackTrace")
权限以及RuntimePermission("modifyThreadGroup")
权限调用安全管理器的checkPermission
方法,以查看是否可以获取所有线程的堆栈跟踪。- 返回:
-
从
Thread
到表示相应线程堆栈跟踪的StackTraceElement
数组的Map
。 - 抛出:
-
SecurityException
- 如果存在安全管理器并且其checkPermission
方法不允许获取线程的堆栈跟踪。 - 自:
- 1.5
- 参见:
-
getId
Deprecated.This method is not final and may be overridden to return a value that is not the thread ID. UsethreadId()
instead.返回此线程的标识符。线程ID是在创建此线程时生成的正数long
数。线程ID是唯一的,在其生命周期内保持不变。- 返回:
- 此线程的ID
- 自:
- 1.5
-
threadId
public final long threadId()返回此线程的标识符。线程ID是在创建此线程时生成的正数long
数。线程ID是唯一的,在其生命周期内保持不变。- 返回:
- 此线程的ID
- 自:
- 19
-
getState
返回此线程的状态。此方法设计用于监视系统状态,而不是用于同步控制。- 返回:
- 此线程的状态。
- 自:
- 1.5
-
setDefaultUncaughtExceptionHandler
设置当线程因未捕获异常突然终止且没有为该线程定义其他处理程序时调用的默认处理程序。未捕获异常处理首先由线程控制,然后由线程的
ThreadGroup
对象控制,最后由默认未捕获异常处理程序控制。如果线程没有显式设置未捕获异常处理程序,并且线程的线程组(包括父线程组)没有专门化其uncaughtException
方法,则将调用默认处理程序的uncaughtException
方法。通过设置默认未捕获异常处理程序,应用程序可以更改对那些已经接受系统提供的“默认”行为的线程处理未捕获异常的方式(例如记录到特定设备或文件)。
请注意,默认未捕获异常处理程序通常不应推迟到线程的
ThreadGroup
对象,因为这可能导致无限递归。- 参数:
-
ueh
- 用作默认未捕获异常处理程序的对象。如果为null
,则没有默认处理程序。 - 抛出:
-
SecurityException
- 如果存在安全管理器并且拒绝RuntimePermission
("setDefaultUncaughtExceptionHandler")
- 自:
- 1.5
- 参见:
-
getDefaultUncaughtExceptionHandler
返回当线程因未捕获异常突然终止时调用的默认处理程序。如果返回值为null
,则没有默认处理程序。- 返回:
- 所有线程的默认未捕获异常处理程序
- 自:
- 1.5
- 参见:
-
getUncaughtExceptionHandler
返回当此线程因未捕获异常突然终止时调用的处理程序。如果此线程尚未显式设置未捕获异常处理程序,则返回此线程的ThreadGroup
对象,除非此线程已终止,在这种情况下返回null
。- 返回:
- 此线程的未捕获异常处理程序
- 自:
- 1.5
-
setUncaughtExceptionHandler
设置当此线程因未捕获异常突然终止时调用的处理程序。线程可以通过显式设置其未捕获异常处理程序来完全控制其对未捕获异常的响应。如果未设置此类处理程序,则线程的
ThreadGroup
对象充当其处理程序。- 参数:
-
ueh
- 用作此线程的未捕获异常处理程序的对象。如果为null
,则此线程没有显式处理程序。 - 抛出:
-
SecurityException
- 如果当前线程不允许修改此线程。 - 自:
- 1.5
- 参见:
-