多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个概念。以ThreadGroup类对象作为构造方法的参数创建一个线程时,实际上就是指定这个线程输入某一个线程组,例如:
//创建一个名称为group的线程组
ThreadGroup group = new ThreadGroup("group");
//创建一个名为myThread的线程并指定这个线程归入group线程组
Thread thread = new Thread(group,"myThread");
从以上代码可以看出:创建线程时能够指定这个线程归入哪个线程组。如果没有指定线程归入哪个线程组,那么这个线程与创建它的线程同在一组。例如A线程创建了B线程,但没有指定B线程归入哪个线程组,那么B线程与A属于同一个线程组。从【例14_01】可以看出:主线程属于一个名为“main”的线程组,因此由主线程创建的子线程默认归入main线程组内。线程在创建之后就不能改变线程组,但Thread类提供了一个getThreadGroup()方法来获得其所属的线程组对象。
ThreadGroup类提供了一些方法来操作线程组,如下面的表14-5所示。
表14-5 ThreadGroup类的方法
方法 | 功能 |
String getName() | 获取线程组的名称 |
int activeCount() | 返回此线程组中活动线程的数目 |
void interrupt() | 中断此线程组中的所有线程 |
boolean isDaemon() | 判断该线程组是否是后台线程组 |
void setDaemon(boolean daemon) | 把该线程组设置成后台线程组 |
ThreadGroup getParent() | 返回当前线程组的父线程组 |
void setMaxPriority(int priority) | 设置线程组的最高优先级 |
从表14-5可以看出:setDaemon方法能够把线程组设置为后台线程组,而后台线程组具有一个特征:当后台线程组的最后一个线程执行结束或被销毁后,后台线程组将自动销毁。此外,getParent()方法能够返回当前线程组的父线程组。一个大的线程组可以被划分为多个小的线程组,小线程组所在的大线程组就被称为父线程组。当父线程组调用activeCount()方法统计其组内活动线程数目时,其下属的每个小线程主中的活动线程数量都会被统计。下面的【例14_16】展示了使用ThreadGroup操作线程组的过程。
【例14_16 线程组】
Exam14_16.java
class MyThread extends Thread{
MyThread(ThreadGroup group,String name){
super(group,name);
}
public void run() {
try {
for (int i=1;i<=5;i++){
System.out.println(this.getName()+":"+i);
Thread.sleep(500);
}
}catch (Exception e){
System.out.println("线程"+this.getName()+"睡眠被中断");//①
}
}
}
public class Exam14_16 {
public static void main(String[] args) {
try {
ThreadGroup group = new ThreadGroup("group");
//创两个建线程并归入group线程组
Thread t1 = new MyThread(group,"A");
Thread t2 = new MyThread(group,"B");
System.out.println("线程组的名称:"+group.getName());
System.out.println("线程组是否为后台线程组:"+group.isDaemon());
System.out.println("group线程组的父线程组:"+group.getParent().getName());
t1.start();//启动t1
t2.start();//启动t2
Thread.sleep(1000);//主线程睡眠1000毫秒
group.interrupt();//②中止线程组中所有睡眠的线程
}catch (Exception e){
e.printStackTrace();
}
}
}
【例14_16】的main()方法中创建了线程组group,并调用group的各种方法获取线程组的相应属性,并且把两个线程t1和t2都归入group线程组。当t1和t2启动后,先让主线程睡眠1000毫秒,然后通过线程组的interrupt()中止睡眠中的子线程。【例14_16】的运行结果如图14-15所示。
图14-15【例14_16】运行结果
从图14-15可以看出:如果线程组没有指定父线程组,那么将以系统创建的main线程组作为父线程组。此外,线程组的interrupt()能够中止线程组内睡眠中线程,但这会引起组内线程运行出现异常。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。
标签:group,14,Thread,16,ThreadGroup,线程,第十四章,多线程 From: https://blog.51cto.com/mugexuetang/5983935