Module java.base
Package java.lang

Class ThreadGroup

java.lang.Object
java.lang.ThreadGroup
所有已实现的接口:
Thread.UncaughtExceptionHandler

public class ThreadGroup extends Object implements Thread.UncaughtExceptionHandler
线程组表示一组线程。此外,线程组还可以包括其他线程组。线程组形成一个树,其中除了初始线程组之外的每个线程组都有一个父线程组。

线程组有一个名称和最大优先级。名称在创建组时指定,不能更改。组的最大优先级是在组中创建线程的最大优先级。最初从父线程组继承,但可以使用setMaxPriority方法进行更改。

线程组从其父组弱引用,因此当组中没有活动线程且线程组在其他方面不可达时,它就有资格进行垃圾回收。

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

线程组和虚拟线程

Java运行时为虚拟线程创建了一个特殊的线程组。当在虚拟线程上调用Thread.getThreadGroup方法时,将返回此组。该线程组与其他线程组不同,其最大优先级是固定的,无法使用setMaxPriority方法更改。虚拟线程不包括在activeCount方法返回的估计线程计数中,不会被enumerate方法枚举,并且不会被interrupt方法中断。
API注释:
线程组在早期Java版本中提供了一种将线程分组并为线程提供一种形式的作业控制的方式。线程组支持隔离小程序,并定义了用于诊断目的的方法。新应用程序很少需要创建ThreadGroups并与此API交互。
自:
1.0
  • Constructor Summary

    Constructors
    Constructor
    Description
    构造一个新的线程组。
    ThreadGroup(ThreadGroup parent, String name)
    创建一个新的线程组。
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    返回此线程组及其子组中活动平台线程的估计数量。
    int
    返回此线程组及其子组中组的估计数量。
    final void
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法仅在与安全管理器一起使用时有用,安全管理器已被弃用并可能在将来的版本中被移除。
    final void
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初用于销毁空线程组。
    int
    enumerate(Thread[] list)
    将此线程组及其子组中的每个活动平台线程复制到指定的数组中。
    int
    enumerate(Thread[] list, boolean recurse)
    将此线程组中的每个活动平台线程复制到指定的数组中。
    int
    将此线程组及其子组中的每个子组的引用复制到指定的数组中。
    int
    enumerate(ThreadGroup[] list, boolean recurse)
    将此线程组中的每个子组的引用复制到指定的数组中。
    final int
    返回此线程组的最大优先级。
    final String
    返回此线程组的名称。
    final ThreadGroup
    返回此线程组的父线程组。
    final void
    中断此线程组及其子组中的所有活动平台线程。
    final boolean
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初指示线程组是否为守护线程组,当其最后一个线程终止时自动销毁。
    boolean
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初指示线程组是否已销毁。
    void
    list()
    将有关此线程组的信息打印到标准输出。
    final boolean
    测试此线程组是否为线程组参数或其祖先线程组之一。
    final void
    resume()
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初指定恢复线程组中的所有线程。
    final void
    setDaemon(boolean daemon)
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初配置线程组是否为守护线程组,当其最后一个线程终止时自动销毁。
    final void
    setMaxPriority(int pri)
    设置组的最大优先级。
    final void
    stop()
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初指定停止线程组中的所有线程。
    final void
    已弃用,将被移除: 此API元素可能在将来的版本中被移除。
    此方法最初指定挂起线程组中的所有线程。
    返回此线程组的字符串表示形式。
    void
    当此线程组中的线程因未捕获的异常而停止,并且线程没有安装特定的Thread.UncaughtExceptionHandler时,Java虚拟机将调用此方法。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • ThreadGroup

      public ThreadGroup(String name)
      构造一个新的线程组。此新组的父组是当前运行线程的线程组。

      调用父线程组的checkAccess方法,不带参数;这可能导致安全异常。

      参数:
      name - 新线程组的名称,可以为null
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程。
      参见:
    • ThreadGroup

      public ThreadGroup(ThreadGroup parent, String name)
      创建一个新的线程组。此新组的父组是指定的线程组。

      调用父线程组的checkAccess方法,不带参数;这可能导致安全异常。

      参数:
      parent - 父线程组。
      name - 新线程组的名称,可以为null
      抛出:
      SecurityException - 如果当前线程无法在指定的线程组中创建线程。
      参见:
  • Method Details

    • getName

      public final String getName()
      返回此线程组的名称。
      返回:
      此线程组的名称,可能为null
    • getParent

      public final ThreadGroup getParent()
      返回此线程组的父组。

      首先,如果父组不为null,则调用父线程组的checkAccess方法,不带参数;这可能导致安全异常。

      返回:
      此线程组的父组。顶级线程组是唯一一个其父组为null的线程组。
      抛出:
      SecurityException - 如果当前线程无法修改此线程组。
      参见:
    • getMaxPriority

      public final int getMaxPriority()
      返回此线程组的最大优先级。这是在线程组中创建新线程的最大优先级。
      返回:
      在线程组中创建新线程的最大优先级
      参见:
    • isDaemon

      @Deprecated(since="16", forRemoval=true) public final boolean isDaemon()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method originally indicated if the thread group is a daemon thread group that is automatically destroyed when its last thread terminates. The concept of daemon thread group no longer exists. A thread group is eligible to be GC'ed when there are no live threads in the group and it is otherwise unreachable.
      返回此线程组的守护状态。守护状态不会被用于任何操作。
      返回:
      此线程组的守护状态
    • isDestroyed

      @Deprecated(since="16", forRemoval=true) public boolean isDestroyed()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method originally indicated if the thread group is destroyed. The ability to destroy a thread group and the concept of a destroyed thread group no longer exists. A thread group is eligible to be GC'ed when there are no live threads in the group and it is otherwise unreachable.
      返回false。
      返回:
      false
      自:
      1.1
    • setDaemon

      @Deprecated(since="16", forRemoval=true) public final void setDaemon(boolean daemon)
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method originally configured whether the thread group is a daemon thread group that is automatically destroyed when its last thread terminates. The concept of daemon thread group no longer exists. A thread group is eligible to be GC'ed when there are no live threads in the group and it is otherwise unreachable.
      设置此线程组的守护状态。守护状态不会被用于任何操作。

      首先,调用此线程组的checkAccess方法,不带参数;这可能导致安全异常。

      参数:
      daemon - 守护状态
      抛出:
      SecurityException - 如果当前线程无法修改此线程组。
      参见:
    • setMaxPriority

      public final void setMaxPriority(int pri)
      设置线程组的最大优先级。对于虚拟线程的ThreadGroup的最大优先级不会被此方法更改(新优先级将被忽略)。已经具有更高优先级的线程组(或子组)中的线程不受此方法的影响。

      首先,调用此线程组的checkAccess方法,不带参数;这可能导致安全异常。

      如果pri参数小于Thread.MIN_PRIORITY或大于Thread.MAX_PRIORITY,则线程组的最大优先级保持不变。

      否则,将此ThreadGroup对象的优先级设置为指定pri和此线程组的父级的最大允许优先级中较小的一个。(如果此线程组是系统线程组,没有父级,则其最大优先级简单地设置为pri。)然后递归调用此方法,对属于此线程组的每个线程组使用pri作为其参数。

      参数:
      pri - 线程组的新优先级。
      抛出:
      SecurityException - 如果当前线程无法修改此线程组。
      参见:
    • parentOf

      public final boolean parentOf(ThreadGroup g)
      测试此线程组是否是线程组参数或其祖先线程组之一。
      参数:
      g - 一个线程组,可以为null
      返回:
      如果此线程组是线程组参数或其祖先线程组之一,则返回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 - 如果当前线程不允许访问此线程组。
      参见:
    • activeCount

      public int activeCount()
      返回此线程组及其子组中的活动平台线程的估计数量。此方法递归地遍历此线程组中的所有子组。

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

      返回:
      此线程组及具有此线程组作为祖先的任何其他线程组中活动线程的估计值
    • enumerate

      public int enumerate(Thread[] list)
      将此线程组及其子组中的每个活动平台线程复制到指定的数组中。此方法不枚举虚拟线程。

      调用此方法的行为与调用

      enumerate(list, true)
      参数:
      list - 用于放置线程列表的数组
      返回:
      放入数组的线程数
      抛出:
      SecurityException - 如果checkAccess确定当前线程无法访问此线程组
    • enumerate

      public int enumerate(Thread[] list, boolean recurse)
      将此线程组中的每个活动平台线程复制到指定的数组中。此方法不枚举虚拟线程。如果recursetrue,此方法递归枚举此线程组的所有子组,并且这些子组中的每个活动平台线程的引用也包括在内。如果数组太短而无法容纳所有线程,则额外的线程将被静默忽略。

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

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

      参数:
      list - 用于放置线程列表的数组
      recurse - 如果为true,递归枚举此线程组的所有子组
      返回:
      放入数组的线程数
      抛出:
      SecurityException - 如果checkAccess确定当前线程无法访问此线程组
    • activeGroupCount

      public int activeGroupCount()
      返回此线程组及其子组中的组数的估计值。递归遍历此线程组中的所有子组。

      返回的值仅是一个估计值,因为线程组的数量可能在此方法遍历内部数据结构时动态更改。此方法主要用于调试和监控目的。

      返回:
      具有此线程组作为祖先的线程组数
    • enumerate

      public int enumerate(ThreadGroup[] list)
      将此线程组及其子组中的每个子组的引用复制到指定的数组中。

      调用此方法的行为与调用

      enumerate(list, true)
      参数:
      list - 用于放置线程组列表的数组
      返回:
      放入数组的线程组数
      抛出:
      SecurityException - 如果checkAccess确定当前线程无法访问此线程组
    • enumerate

      public int enumerate(ThreadGroup[] list, boolean recurse)
      将此线程组中的每个子组的引用复制到指定的数组中。如果recursetrue,此方法递归枚举此线程组的所有子组,并且这些子组中的每个线程组的引用也包括在内。

      应用程序可以使用activeGroupCount方法来估计数组应该有多大,但是如果数组太短而无法容纳所有线程组,则额外的线程组将被静默忽略。如果关键是获取此线程组中的每个子组,则调用方应验证返回的int值严格小于list的长度。

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

      参数:
      list - 用于放置线程组列表的数组
      recurse - 如果为true,递归枚举所有子组
      返回:
      放入数组的线程组数
      抛出:
      SecurityException - 如果checkAccess确定当前线程无法访问此线程组
    • 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 all threads in the thread group. It was inherently unsafe.
      抛出UnsupportedOperationException
    • interrupt

      public final void interrupt()
      中断此线程组及其子组中的所有活动平台线程。
      抛出:
      SecurityException - 如果当前线程不允许访问此线程组或线程组中的任何线程。
      自:
      1.2
      参见:
    • 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 all threads in the thread group.
      抛出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 all threads in the thread group.
      抛出UnsupportedOperationException
    • destroy

      @Deprecated(since="16", forRemoval=true) public final void destroy()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method was originally specified to destroy an empty thread group. The ability to explicitly destroy a thread group no longer exists. A thread group is eligible to be GC'ed when there are no live threads in the group and it is otherwise unreachable.
      什么也不做。
    • list

      public void list()
      将有关此线程组的信息打印到标准输出。此方法仅用于调试。
    • uncaughtException

      public void uncaughtException(Thread t, Throwable e)
      当此线程组中的线程因未捕获的异常而停止,并且线程没有安装特定的Thread.UncaughtExceptionHandler时,Java虚拟机会调用此线程组的uncaughtException方法。

      ThreadGroupuncaughtException方法执行以下操作:

      • 如果此线程组有父线程组,则使用相同的两个参数调用该父线程组的uncaughtException方法。
      • 否则,此方法检查是否安装了默认未捕获异常处理程序,如果有,则调用其uncaughtException方法,使用相同的两个参数。
      • 否则,将包含线程名称(从线程的getName方法返回)和堆栈回溯(使用ThrowableprintStackTrace方法)的消息打印到标准错误流中。

      应用程序可以在ThreadGroup的子类中覆盖此方法,以提供替代处理未捕获异常的方法。

      指定由:
      uncaughtException 在接口 Thread.UncaughtExceptionHandler
      参数:
      t - 即将退出的线程。
      e - 未捕获的异常。
    • toString

      public String toString()
      返回此线程组的字符串表示形式。
      覆盖:
      toString 在类 Object
      返回:
      此线程组的字符串表示形式。