线程组概念
Java中用ThreadGroup来表示线程组
- 每个Thread必然存在于一个ThreadGroup中,不能独立于ThreadGroup存在。
- 如果在new Thread时没有显式指定,那么默认将父线程(当前执行new Thread的线程)线程组设置为自己的线程组。
- 我们可以使用线程组对线程进行批量控制(统一异常处理)。
1 | public class Demo { |
输出结果:
1 | 执行main方法线程名字:main |
ThreadGroup管理着它下面的Thread,ThreadGroup是一个标准的向下引用的树状结构,这样设计的原因是防止”上级”线程被”下级”线程引用而无法有效地被GC回收。
与线程的优先级
1 | public static void main(String[] args) { |
输出:
1 | 我是线程组的优先级6 |
所以,如果某个线程优先级大于线程所在线程组的最大优先级,那么该线程的优先级将会失效,取而代之的是线程组的最大优先级。
线程组常用方法
获取当前的线程组名字
1 | Thread.currentThread().getThreadGroup().getName(); |
复制线程组
1 | // 复制一个线程数组到一个线程组 |
线程组统一异常处理
1 | public class ThreadGroupDemo { |
线程组数据结构
线程组还可以包含其他的线程组,不仅仅是线程。ThreadGroup
源码中的成员变量:
1 | public class ThreadGroup implements Thread.UncaughtExceptionHandler { |
构造函数:
1 | // 私有构造函数 |
第三个构造函数里调用了checkParentAccess
方法,这里看看这个方法的源码:
1 | // 检查parent ThreadGroup |
- 这里涉及到
SecurityManager
这个类,它是Java的安全管理器,它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。比如引入了第三方类库,但是并不能保证它的安全性。 - 其实Thread类也有一个checkAccess()方法,不过是用来当前运行的线程是否有权限修改被调用的这个线程实例。(Determines if the currently running thread has permission to modify this thread.)
总结
- 线程组是一个树状的结构。
- 每个线程组下面可以有多个线程或者线程组。
- 线程组可以起到统一控制线程的优先级和检查线程的权限的作用。