阅读(4846) (3)

鸿蒙OS ThreadGroup

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

ThreadGroup

java.lang.Object

|---java.lang.ThreadGroup

public class ThreadGroup
extends Object
implements Thread.UncaughtExceptionHandler

一个线程组代表一组线程。 此外,一个线程组还可以包括其他线程组。 线程组形成一棵树,其中除了初始线程组之外的每个线程组都有一个父级。

允许线程访问有关其自己的线程组的信息,但不能访问有关其线程组的父线程组或任何其他线程组的信息。

构造函数摘要

构造函数 描述
ThreadGroup(String name) 构造一个新的线程组。
ThreadGroup(ThreadGroup parent, String name) 创建一个新的线程组。

方法总结

修饰符和类型 方法 描述
int activeCount() 返回此线程组及其子组中活动线程数的估计值。
int activeGroupCount() 返回此线程组及其子组中活动组数的估计值。
boolean allowThreadSuspension(boolean b) 已弃用。 此调用的定义取决于已弃用的suspend()。 此外,从未指定此调用的行为。
void checkAccess() 确定当前运行的线程是否有权修改此线程组。
void destroy() 销毁此线程组及其所有子组。
int enumerate(Thread[] list) 将此线程组及其子组中的每个活动线程复制到指定的数组中。
int enumerate(Thread[] list, boolean recurse) 将此线程组中的每个活动线程复制到指定的数组中。
int enumerate(ThreadGroup[] list) 将对该线程组及其子组中每个活动子组的引用复制到指定的数组中。
int enumerate(ThreadGroup[] list, boolean recurse) 将对该线程组中每个活动子组的引用复制到指定的数组中。
int getMaxPriority() 返回此线程组的最大优先级。
String getName() 返回此线程组的名称。
ThreadGroup getParent() 返回此线程组的父级。
void interrupt() 中断此线程组中的所有线程。
boolean isDaemon() 测试此线程组是否为守护线程组。
boolean isDestroyed() 测试此线程组是否已被销毁。
void list() 将有关此线程组的信息打印到标准输出。
boolean parentOf(ThreadGroup g) 测试此线程组是线程组参数还是它的祖先线程组之一。
void resume() 已弃用。 此方法仅与 Thread.suspend 和 ThreadGroup.suspend 一起使用,这两种方法都已被弃用,因为它们本身就容易死锁。
void setDaemon(boolean daemon) 更改此线程组的守护程序状态。
void setMaxPriority(int pri) 设置组的最大优先级。
void stop() 已弃用。 这种方法本质上是不安全的。
void suspend() 已弃用。 这种方法本质上容易死锁。
String toString() 返回此线程组的字符串表示形式。
void uncaughtException(Thread t, Throwable e) 当此线程组中的线程由于未捕获的异常而停止并且该线程没有安装特定的 Thread.UncaughtExceptionHandler 时,由 Java 虚拟机调用。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

构造函数详细信息

ThreadGroup

public ThreadGroup(String name)

构造一个新的线程组。 这个新组的父组是当前运行线程的线程组。

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

参数:

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

Throws:

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

ThreadGroup

public ThreadGroup(ThreadGroup parent, String name)

创建一个新的线程组。 这个新组的父级是指定的线程组。

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

参数:

参数名称 参数描述
parent 父线程组。
name 新线程组的名称。

Throws:

Throw名称 Throw描述
NullPointerException 如果线程组参数为空。
SecurityException 如果当前线程无法在指定线程组中创建线程。

方法详情

getName

public final String getName()

返回此线程组的名称。

返回:

此线程组的名称。

getParent

public final ThreadGroup getParent()

返回此线程组的父级。

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

返回:

此线程组的父级。 顶级线程组是唯一其父级为空的线程组。

Throws:

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

getMaxPriority

public final int getMaxPriority()

返回此线程组的最大优先级。 属于该组的线程的优先级不能高于最大优先级。

返回:

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

isDaemon

public final boolean isDaemon()

测试此线程组是否为守护线程组。 守护线程组在其最后一个线程停止或其最后一个线程组被销毁时自动销毁。

返回:

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

isDestroyed

public boolean isDestroyed()

测试此线程组是否已被销毁。

返回:

如果此对象被销毁,则为 true

setDaemon

public final void setDaemon(boolean daemon)

更改此线程组的守护程序状态。

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

守护线程组在其最后一个线程停止或其最后一个线程组被销毁时自动销毁。

参数:

参数名称 参数描述
daemon 如果为true,则将此线程组标记为守护线程组; 否则,将此线程组标记为正常。

Throws:

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

setMaxPriority

public final void setMaxPriority(int pri)

设置组的最大优先级。 线程组中已经具有较高优先级的线程不受影响。

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

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

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

参数:

参数名称 参数描述
pri 线程组的新优先级。

Throws:

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

parentOf

public final boolean parentOf(ThreadGroup g)

测试此线程组是线程组参数还是它的祖先线程组之一。

参数:

参数名称 参数描述
g 一个线程组。

返回:

如果此线程组是线程组参数或其祖先线程组之一,则为 true; 否则为假。

checkAccess

public final void checkAccess()

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

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

Throws:

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

activeCount

public int activeCount()

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

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

返回:

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

enumerate

public int enumerate(Thread[] list)

将此线程组及其子组中的每个活动线程复制到指定的数组中。

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

enumerate(list, true)

参数:

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

返回:

放入数组的线程数

Throws:

Throw名称 Throw描述
SecurityException if checkAccess判断当前线程不能访问这个线程组

enumerate

public int enumerate(Thread[] list, boolean recurse)

将此线程组中的每个活动线程复制到指定的数组中。 如果 recurse 为真,则此方法递归枚举此线程组的所有子组,并且还包括对这些子组中每个活动线程的引用。 如果数组太短而无法容纳所有线程,则会默默忽略多余的线程。

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

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

参数:

参数名称 参数描述
list 将线程列表放入其中的数组
recurse 如果为true,递归枚举该线程组的所有子组

返回:

放入数组的线程数

Throws:

Throw名称 Throw描述
SecurityException if checkAccess判断当前线程不能访问这个线程组

activeGroupCount

public int activeGroupCount()

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

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

返回:

以此线程组为祖先的活动线程组的数量

enumerate

public int enumerate(ThreadGroup[] list)

将对该线程组及其子组中每个活动子组的引用复制到指定的数组中。

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

enumerate(list, true)

参数:

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

返回:

放入数组的线程组数

Throws:

Throw名称 Throw描述
SecurityException if checkAccess判断当前线程不能访问这个线程组

enumerate

public int enumerate(ThreadGroup[] list, boolean recurse)

将对该线程组中每个活动子组的引用复制到指定的数组中。 如果 recurse 为真,则此方法递归枚举此线程组的所有子组,并且还包括对这些子组中每个活动线程组的引用。

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

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

参数:

参数名称 参数描述
list 将线程组列表放入其中的数组
recurse 如果为true,递归枚举所有子组

返回:

放入数组的线程组数

Throws:

Throw名称 Throw描述
SecurityException if checkAccess判断当前线程不能访问这个线程组

stop

@Deprecated public final void stop()

已弃用。 这种方法本质上是不安全的。

停止此线程组中的所有线程。

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

然后,此方法在此线程组及其所有子组中的所有线程上调用 stop 方法。

Throws:

Throw名称 Throw描述
SecurityException 如果不允许当前线程访问该线程组或线程组中的任何线程。

interrupt

public final void interrupt()

中断此线程组中的所有线程。

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

然后,此方法在此线程组及其所有子组中的所有线程上调用中断方法。

Throws:

Throw名称 Throw描述
SecurityException 如果不允许当前线程访问该线程组或线程组中的任何线程。

suspend

@Deprecated public final void suspend()

已弃用。 这种方法本质上容易死锁。

挂起该线程组中的所有线程。

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

然后,此方法在此线程组及其所有子组中的所有线程上调用挂起方法。

Throws:

Throw名称 Throw描述
SecurityException 如果不允许当前线程访问该线程组或线程组中的任何线程。

resume

@Deprecated public final void resume()

已弃用。 此方法仅与 Thread.suspend 和 ThreadGroup.suspend 一起使用,这两种方法都已被弃用,因为它们本身就容易死锁。

恢复此线程组中的所有线程。

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

然后,此方法在此线程组及其所有子组中的所有线程上调用 resume 方法。

Throws:

Throw名称 Throw描述
SecurityException 如果不允许当前线程访问该线程组或线程组中的任何线程。

destroy

public final void destroy()

销毁此线程组及其所有子组。 此线程组必须为空,表示该线程组中的所有线程都已停止。

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

Throws:

Throw名称 Throw描述
IllegalThreadStateException 如果线程组不为空或线程组已被销毁。
SecurityException 如果当前线程不能修改这个线程组。

list

public void list()

将有关此线程组的信息打印到标准输出。 此方法仅对调试有用。

uncaughtException

public void uncaughtException(Thread t, Throwable e)

当此线程组中的线程由于未捕获的异常而停止并且该线程没有安装特定的 Thread.UncaughtExceptionHandler 时,由 Java 虚拟机调用。

ThreadGroup 的 uncaughtException 方法执行以下操作:

  • 如果该线程组有一个父线程组,则使用相同的两个参数调用该父线程组的 uncaughtException 方法。
  • 否则,此方法检查是否安装了 Thread#getDefaultUncaughtExceptionHandler,如果是,则使用相同的两个参数调用其 uncaughtException 方法。
  • 否则,此方法确定 Throwable 参数是否是 ThreadDeath 的实例。如果是这样,没有什么特别的。否则,一条包含线程名称的消息(从线程的 Thread#getName 方法返回)和使用 Throwable 的 Throwable#printStackTrace 方法的堆栈回溯将打印到 System#err。

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

指定者:

接口 Thread.UncaughtExceptionHandler 中的 uncaughtException

参数:

参数名称 参数描述
t 即将退出的线程。
e 未捕获的异常。

allowThreadSuspension

@Deprecated public boolean allowThreadSuspension(boolean b)

已弃用。 此调用的定义取决于已弃用的suspend()。 此外,从未指定此调用的行为。

VM 使用它来控制 lowmem 隐式挂起。

参数:

参数名称 参数描述
b 允许或禁止暂停的布尔值

返回:

true on success

toString

public String toString()

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

覆盖:

类 Object 中的 toString

返回:

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