线程组
2021年7月15日大约 2 分钟约 732 字
1. 线程组ThreadGroup类
Java 使用 ThreadGroup
来表示线程组,它可以对一批线程进行分类管理,Java 允许程序直接对线程组进行控制,对线程组的控制相当于同时控制这批线程。
用户创建的所有线程都属于某个线程组,如果程序没有显式指定线程属于哪个线程组,则该线程属于默认线程组。在默认情况下,子线程和其父线程属于同一个线程组。
一旦某个线程加入了指定线程组,该线程将一直属于该线程组,直至该线程死亡。
2. Thread类与线程组相关的方法
2.1 构造方法
Thread
类提供了如下几个构造器来设置新创建的线程属于哪个线程组:
方法 | 说明 |
---|---|
Thread(ThreadGroup group, Runnable target) | 以target 的run 方法作为线程执行体创建新线程,属于group 线程组。 |
Thread(ThreadGroup group, Runnable target, String name) | 同上,线程名取作name |
Thread(ThreadGroup group, String name) | 创建新线程,取名name ,属于group 线程组 |
2.2 普通方法
Thread
类可通过 getThreadGroup
方法来返回该线程所属的线程组,返回类型为 ThreadGroup
类型。
3. ThreadGroup类
ThreadGroup
类的对象必须被指定一个字符串类型的名字,故而 ThreadGroup
的构造器为:
构造方法 | 说明 |
---|---|
ThreadGroup(String name) | 以指定的线程组名字来创建新的线程组 |
ThreadGroup(ThreadGroup parent, String name) | 以指定的名字、指定的父线程组创建一个新线程组 |
ThreadGroup
类的常用方法:
方法 | 说明 |
---|---|
String getName() | 返回线程组的名字 |
int activeCount() | 返回线程组中活动线程的数目 |
interrupt() | 中断此线程组中的所有线程 |
isDaemon() | 判断该线程组是否是后台线程组 |
setDaemon(boolean daemon) | 把该线程组设置为后台线程组 |
setMaxPriority(int priority) | 设置线程组的最高优先级 |
void uncaughtException(Thread t, Throwable e) | 该方法可以处理该线程组内任意线程所抛出的未处理异常 |
4. 后台线程组
后台线程组有一个特征:当其最后一个线程执行结束或最后一个线程被销毁后,后台线程组将自动销毁。
5. 线程组异常处理
ThreadGroup
类实现了 Thread.UncaughtExceptionHandler
接口,所以每个线程所属的线程组将会作为默认的异常处理器。
线程组处理异常的默认流程如下:
- 若该线程组有父线程组,调用父线程组的
uncaughtException
方法来处理该异常; - 若该线程实例所属的线程类有默认的异常处理器,调用该异常处理器来处理该异常;
- 若该异常对象是
ThreadDeath
的对象,不做任何处理;否则,将异常跟踪栈的信息打印到System.err
错误输出流,并结束该线程。