《多线程》第7节:线程组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《多线程》第7节:线程组相关的知识,希望对你有一定的参考价值。


多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。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所示。

第十四章《多线程》第7节:线程组_System

图14-15【例14_16】运行结果

从图14-15可以看出:如果线程组没有指定父线程组,那么将以系统创建的main线程组作为父线程组。此外,线程组的interrupt()能够中止线程组内睡眠中线程,但这会引起组内线程运行出现异常。

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

 

以上是关于《多线程》第7节:线程组的主要内容,如果未能解决你的问题,请参考以下文章

Java高级特性 第7节 多线程

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_7_等待唤醒机制需求分析

蚂蚁课堂(每特学院)-2期

《多线程》第4节:控制线程

《多线程》第6节:线程通信

《多线程》第9节:ThreadLocal类