「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
Java线程组
类似于在计算机中使用文件夹管理文件,也可以使用线程组来管理线程,在线程组中定义一组相似(相关)的线程,在线程组中也可以定义子线程组。
Thread类有几个构造方法允许在创建线程时指定线程组,如果在创建线程时没有指定线程组则该线程就属于父线程所在的线程组,JVM在创建main线程时会为它指定一个线程组,因此每个Java线程都有一个线程组与之关联, 可以调用线程的getThreadGroup()方法返回线程组。
线程组开始是出于安全的考虑设计用来区分不同的Applet,然而ThreadGroup并未实现这一目标,在新开发的系统中,已经不常用线程组,现在一般会将一组相关的线程存入一个数组或一个集合中,如果仅仅是用来区分线程时,可以使用线程名称来区分,多数情况下,可以忽略线程组。
Java创建线程组
package com.wkcto.threadgroup;
/**
* 演示创建线程组
*/
public class Test01 {
public static void main(String[] args) {
// 1) 返回当前main线程的线程组
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线程组中的子线程组, 调用线程组的getParent()方法返回父线程组
System.out.println( group1.getParent() == mainGroup); //true
System.out.println( group2.getParent() == mainGroup);
//4) 在创建线程时指定所属线程组
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread());
}
};
//在创建线程时,如果没有指定线程组,则默认线程归属到父线程的线程组中
//在main线程中创建了t1线程,称main线程为父线程,t1线程为子线程, t1没有指定线程组则t1线程就归属到父线程main线程的线程组中
Thread t1 = new Thread(r, "t1");
System.out.println( t1 ); //Thread[t1,5,main], t1的线程组是main线程组
//创建线程时,可以指定线程所属线程组
Thread t2 = new Thread(group1, r, "t2");
Thread t3 = new Thread(group2, r, "t3");
System.out.println(t2);
System.out.println(t3);
}
}
Java线程组的基本操作
- activeCount() 返回当前线程组及子线程组中活动线程的数量(近似值)。
- activeGroupCount() 返回当前线程组及子线程组中活动线程组的数量(近似值)。
- int enumerate(Thread[] list) 将当前线程组中的活动线程复制到参数数组中。
- enumerate(ThreadGroup[] list) 将当前线程组中的活动线程组复制到参数数组中。
- getMaxPriority() 返回线程组的最大优先级,默认是10。
- getName() 返回线程组的名称。
- getParent() 返回父线程组。
- interrupt() 中断线程组中所有的线程。
- isDaemon() 判断当前线程组是否为守护线程组。
- list() 将当前线程组中的活动线程打印出来。
- parentOf(ThreadGroup g) 判断当前线程组是否为参数线程组的父线程组。
- setDaemon(boolean daemon) 设置线程组为守护线程组。
package com.wkcto.threadgroup;
/**
* 演示线程组的基本操作
*/
public class Test02 {
public static void main(String[] args) {
ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); //返回当前线程组
//再定义线程组
ThreadGroup group = new ThreadGroup("group"); //默认group的父线程组是main线程组
Runnable r = new Runnable() {
@Override
public void run() {
while (true){
System.out.println("-----------当前线程: " + Thread.currentThread());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t1 = new Thread(r, "t1"); //默认在main线程组中创建线程
Thread t2 = new Thread(group, r, "t2"); //在指定的group线程组中创建线程
t1.start();
t2.start();
//打印线程组的相关属性
System.out.println("main 线程组中活动线程数量: " + mainGroup.activeCount()); //4, main线程组中活动线程: main, t1, t2, 垃圾回收器
System.out.println("group 子线程组中活动线程数量: " + group.activeCount()); //1, t2
System.out.println("main线程组中子线程组数量: " + mainGroup.activeGroupCount()); //1, group
System.out.println("group子线程组中子线程组数量: " + group.activeGroupCount()); //0
System.out.println("main线程组的父线程组: " + mainGroup.getParent()); //main线程组的父线程组是system
System.out.println("group线程组的父线程组: " + group.getParent()); //main
System.out.println( mainGroup.parentOf(mainGroup)); //true, 线程组也是它自己的父线程组
System.out.println( mainGroup.parentOf(group)); //true
mainGroup.list(); //把main线程组中所有的线程打印输出
}
}