介绍
-
类似于在计算机中使用文件夹管理,也可以使用线程组来管理线程,在线程组中定义一组相似的线程,在线程组中也可以定义子线程组
-
Thread类有几个构造方法允许在创建线程时指定线程组,如果在创建线程时没有指定线程组则该线程就属于服线程所在的线程组。JVM在创建main线程时会为它指定一个线程组,因此每个java线程都有一个线程组与它关联,可以地调用线程的getThreadGroup方法返回线程组
-
线程组开始是处于安全的考虑,设计用来区分不同的Applet,然而ThreadGroup并没有实现这个目标,在新开发的系统中已经不常用线程组,现在我们一般会将一组相关的线程存入一个数组或者集合当中,如果仅仅是用来区分线程池,我们可以使用线程名称,多数情况下我们可以忽略线程组
一、创建线程组
dome
package com.dome.threadgroup;
/**
* @author qb
* @version 1.0
* @Description
* 创建线程组
* @date 2021/3/11 16:27
*/
public class Test01 {
public static void main(String[] args) {
//返回当前amin线程的线程组
ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
System.out.println(mainGroup);
//2.定义线程组,如果不指定所属的线程组则她自动归属到当前线程所属的线程组中
ThreadGroup group1 = new ThreadGroup("group1");
System.out.println(group1);
//3.定义线程组,同时指定父线程组
ThreadGroup group2 = new ThreadGroup(mainGroup,"group2");
//现在group1和group2是mainGroup线程组中的子线程组
System.out.println(group1.getParent() == mainGroup); //true
System.out.println(group2.getParent() == mainGroup); //true
//4.创建线程组是指定所属线程组
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread());
}
};
//在创建线程时没有指定线程组,则默认归属到父线程组
Thread t1 = new Thread(r,"t1");
System.out.println(t1); //Thread[t1,5,main] 线程名称、优先级、线程组的名称
//创建线程指定线程组
Thread t2 = new Thread(group1,r,"t2");
Thread t3 = new Thread(group2,r,"t3");
System.out.println(t2);//Thread[t2,5,group1]
System.out.println(t3); //Thread[t3,5,group2]
}
}
2.线程组的基本操作
activeCount() 返回当前线程组及子线程组中活动的线程数量,预估值
activeGroupCount()返回当前线程组及子线程组中活动的线程租数量,预估值
enumerate(Thread[] list) 将当前线程组中的获取线程复制到参数数组中
enumerate(ThreadGroup[] list) 将当前线程组中的获取线程组复制到参数数组中
getMAxPriority()返回线程组的最大优先级,默认10, 最大是10
getName() 返回线程组的名称
getParent()返回父线程组
interrupt() 中断线程组中所有线程
isDaemon() 判断当前线程组是否为守护线程
list() 将当前线程组中活动的线程打印出来