Java多线程 线程组原理及实例详解

 更新时间:2019年09月06日 08:39:07   作者:慢慢来  
这篇文章主要介绍了Java多线程 线程组原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

线程组

线程组可以批量管理线程和线程组对象。

一级关联

例子如下,建立一级关联。

public class MyThread43 implements Runnable{
  public void run()
  {
    try
    {
      while (!Thread.currentThread().isInterrupted())
      {
        System.out.println("ThreadName = " + Thread.currentThread().getName());
        Thread.sleep(3000);
      }
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args)
  {
    MyThread43 mt0 = new MyThread43();
    MyThread43 mt1 = new MyThread43();
    ThreadGroup tg = new ThreadGroup("新建线程组1");
    Thread t0 = new Thread(tg, mt0);
    Thread t1 = new Thread(tg, mt1);
    t0.start();
    t1.start();
    System.out.println("活动的线程数为:" + tg.activeCount());
    System.out.println("线程组的名称为:" + tg.getName());
  }
}

输出结果如下

活动的线程数为:2
线程组的名称为:新建线程组1
ThreadName = Thread-0
ThreadName = Thread-1
ThreadName = Thread-0
ThreadName = Thread-1
ThreadName = Thread-1
ThreadName = Thread-0
ThreadName = Thread-1
ThreadName = Thread-0
······

每隔三秒输出两个线程名称,符合预期。

线程组自动归组属性

public class ThreadDomain49 {
  public static void main(String[] args) {
    System.out.println("A处线程:" + Thread.currentThread().getName() + ", 所属线程:" + Thread.currentThread().getThreadGroup().getName() +
        ", 组中有线程组数量:" + Thread.currentThread().getThreadGroup().activeGroupCount());
    ThreadGroup group = new ThreadGroup("新的组");
    System.out.println("B处线程:" + Thread.currentThread().getName() + ", 所属线程:" + Thread.currentThread().getThreadGroup().getName() +
        ", 组中有线程组数量:" + Thread.currentThread().getThreadGroup().activeGroupCount());
    ThreadGroup[] tg = new ThreadGroup[Thread.currentThread().getThreadGroup().activeGroupCount()];
    Thread.currentThread().getThreadGroup().enumerate(tg);
    for (int i = 0; i < tg.length; i++)
      System.out.println("第一个线程组名称为:" + tg[i].getName());
  }
}

输出结果如下

A处线程:main, 所属线程:main, 组中有线程组数量:0
B处线程:main, 所属线程:main, 组中有线程组数量:1
第一个线程组名称为:新的组

没有指定线程组,则归属到当前线程所属的组。

根线程组

public class ThreadDomain50 {
  public static void main(String[] args)
  {
    System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());
    System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName());
  }
}

运行结果

system
Exception in thread "main" java.lang.NullPointerException
  at com.advance.MultiThread3.MyThread.ThreadDomain50.main(ThreadDomain50.java:14)

当前线程的线程组的父线程组是系统线程组;系统线程组的父线程组不存在;系统线程组就是根线程组。

批量停止组内线程

请看示例

public class MyThread44 extends Thread{

  public MyThread44(ThreadGroup tg, String name)
  {
    super(tg, name);
  }

  public void run()
  {
    System.out.println("ThreadName = " + Thread.currentThread().getName() +
        "准备开始死循环了");
    while (!this.isInterrupted()){}
    System.out.println("ThreadName = " + Thread.currentThread().getName() +
        "结束了");
  }

  public static void main(String[] args) throws InterruptedException {
    ThreadGroup tg = new ThreadGroup("我的线程组");
    MyThread44 mt = null;
    for (int i = 0; i < 3; i++)
    {
      mt = new MyThread44(tg, "线程" + i);
      mt.start();
    }
    Thread.sleep(5000);
    tg.interrupt();
    System.out.println("调用了interrupt()方法");
  }
}

输出结果如下

ThreadName = 线程0准备开始死循环了
ThreadName = 线程1准备开始死循环了
ThreadName = 线程2准备开始死循环了
调用了interrupt()方法
ThreadName = 线程0结束了
ThreadName = 线程2结束了
ThreadName = 线程1结束了

可以看到,ThreadGroup的interrupt方法批量中断线程组的线程。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Nacos Discovery服务治理解决方案

    Nacos Discovery服务治理解决方案

    DiscoveryClient是专门负责服务注册和发现的,我们可以通过它获取到注册到注册中心的所有服务,这篇文章主要介绍了Nacos Discovery服务治理,需要的朋友可以参考下
    2022-11-11
  • SpringBoot中如何打印Http请求日志

    SpringBoot中如何打印Http请求日志

    所有针对第三方的请求都强烈推荐打印请求日志,本文主要介绍了SpringBoot中如何打印Http请求日志,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Java面向对象基础之多态性,抽象类和接口

    Java面向对象基础之多态性,抽象类和接口

    这篇文章主要介绍了Java面向对象基础:多态性,抽象类和接口,文中代码可以帮助各位更好的理解学习,有需求的小伙伴可以参考下
    2020-05-05
  • Java for循环详解

    Java for循环详解

    这篇文章主要介绍了Java for循环方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 浅谈java日志格式化

    浅谈java日志格式化

    不管我们使用何种语言开发,一旦程序发生异常,日志是一个很重要的数据。但是并不是意味着打印的日志越多越好,我们需要的是有用的日志。下面小编来和大家一起学习以下知识
    2019-05-05
  • springboot以FTP方式上传文件到远程服务器

    springboot以FTP方式上传文件到远程服务器

    这篇文章主要介绍了springboot以FTP方式上传文件到远程服务器,需要的朋友可以参考下
    2019-12-12
  • Java多线程编程中使用DateFormat类

    Java多线程编程中使用DateFormat类

    这篇文章主要介绍了Java多线程编程中使用DateFormat类,文中介绍了三种相关的并发使用方法,需要的朋友可以参考下
    2015-07-07
  • 图解Java经典算法冒泡排序的原理与实现

    图解Java经典算法冒泡排序的原理与实现

    冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序
    2022-09-09
  • 教你bat脚本一键配置java开发环境

    教你bat脚本一键配置java开发环境

    公司新入职一名员工,项目经理让我安排新人工作,首先需要对java开发相关环境进行配置安装,但时常会因为安装配置不到位或者操作错误导致时间的浪费,所以在空余时间收集了一系列软件的免安装版本,感兴趣的朋友一起看看吧
    2021-12-12
  • Java深入讲解Bean作用域与生命周期

    Java深入讲解Bean作用域与生命周期

    这篇文章主要介绍了浅谈Spring中Bean的作用域和生命周期,从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲,感兴趣的可以学习一下
    2022-06-06

最新评论