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


    多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个概念。以ThreadGroup类对象作为构造方法的参数创建一个线程时,实际上就是指定这个线程归入某一个线程组,例如:

    1. //创建一个名称为group的线程组
    2. ThreadGroup group  = new ThreadGroup("group");
    3. //创建一个名为myThread的线程并指定这个线程归入group线程组
    4. 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

    1. class MyThread extends Thread{
    2. MyThread(ThreadGroup group,String name){
    3. super(group,name);
    4. }
    5. public void run() {
    6. try {
    7. for (int i=1;i<=5;i++){
    8. System.out.println(this.getName()+":"+i);
    9. Thread.sleep(500);
    10. }
    11. }catch (Exception e){
    12. System.out.println("线程"+this.getName()+"睡眠被中断");//①
    13. }
    14. }
    15. }
    16. public class Exam14_16 {
    17. public static void main(String[] args) {
    18. try {
    19. ThreadGroup group = new ThreadGroup("group");
    20. //创两个建线程并归入group线程组
    21. Thread t1 = new MyThread(group,"A");
    22. Thread t2 = new MyThread(group,"B");
    23. System.out.println("线程组的名称:"+group.getName());
    24. System.out.println("线程组是否为后台线程组:"+group.isDaemon());
    25. System.out.println("group线程组的父线程组:"+group.getParent().getName());
    26. t1.start();//启动t1
    27. t2.start();//启动t2
    28. Thread.sleep(1000);//主线程睡眠1000毫秒
    29. group.interrupt();//②中止线程组中所有睡眠的线程
    30. }catch (Exception e){
    31. e.printStackTrace();
    32. }
    33. }
    34. }

    【例14_16】的main()方法中创建了线程组group,并调用group的各种方法获取线程组的相应属性,并且把两个线程t1和t2都归入group线程组。当t1和t2启动后,先让主线程睡眠1000毫秒,然后通过线程组的interrupt()中止睡眠中的子线程。【例14_16】的运行结果如图14-15所示。

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

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

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

     

  • 相关阅读:
    秋招应届毕业生求职 如何通过在线测评?
    情人节程序员用HTML网页表白【粒子告白】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
    番茄插件番茄助手下载
    【shell脚本编写】shell 数组的使用
    ARM_day8:温湿度数据采集应用
    ToBeWritten之记录狩猎过程
    软件测试工作流程?
    SpringCloud微服务实战——搭建企业级开发框架(五十二):第三方登录-微信小程序授权登录流程设计和实现
    信息论基础
    业务可视化-让你的流程图"Run"起来(4.实际业务场景测试)
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128111182