Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理。可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示。

用户创建的所有线程都属于指定线程组,如果没有显式指定属于哪个线程组,那么该线程就属于默认线程组(即main线程组)。默认情况下,子线程和父线程处于同一个线程组。

此外,只有在创建线程时才能指定其所在的线程组,线程运行中途不能改变它所属的线程组,也就是说线程一旦指定所在的线程组就不能改变。

二.为什么要使用线程组

1.安全

同一个线程组的线程是可以相互修改对方的数据的。但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全。

2.批量管理

可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织或控制。

三.线程组使用示例

1.线程关联线程组:一级关联

所谓一级关联就是父对象中有子对象,但并不创建孙对象。比如创建一个线程组,然后将创建的线程归属到该组中,从而对这些线程进行有效的管理。代码示例如下:

public class ThreadGroupTest {

public static void main(String[] args) {

ThreadGroup rootThreadGroup = new ThreadGroup("root线程组");

Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A");

Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B");

thread0.start();

thread1.start();

}

}

class MRunnable implements Runnable {

@Override

public void run() {

while (!Thread.currentThread().isInterrupted()) {

System.out.println("线程名: " + Thread.currentThread().getName()

+ ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()) ;

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

复制代码

执行结果如下:

线程名: 线程A, 所在线程组: root线程组

线程名: 线程B, 所在线程组: root线程组

复制代码

2.线程关联线程组:多级关联

所谓的多级关联就是父对象中有子对象,子对象中再创建孙对象也就出现了子孙的效果了。比如使用下图第二个构造方法,将子线程组归属到某个线程组,再将创建的线程归属到子线程组,这样就会有线程树的效果了。

代码示例如下:

public class ThreadGroupTest {

public static void main(String[] args) {

ThreadGroup rootThreadGroup = new ThreadGroup("root线程组");

Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A");

Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B");

thread0.start();

thread1.start();

ThreadGroup threadGroup1 = new ThreadGroup(rootThreadGroup, "子线程组");

Thread thread2 = new Thread(threadGroup1, new MRunnable(), "线程C");

Thread thread3 = new Thread(threadGroup1, new MRunnable(), "线程D");

thread2.start();

thread3.start();

}

}

class MRunnable implements Runnable {

@Override

public void run() {

while (!Thread.currentThread().isInterrupted()) {

System.out.println("线程名: " + Thread.currentThread().getName()

+ ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()

+ ", 父线程组: " + Thread.currentThread().getThreadGroup().getParent().getName());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

复制代码

执行结果如下:

线程名: 线程A, 所在线程组: root线程组, 父线程组: main

线程名: 线程B, 所在线程组: root线程组, 父线程组: main

线程名: 线程C, 所在线程组: 子线程组, 父线程组: root线程组

线程名: 线程D, 所在线程组: 子线程组, 父线程组: root线程组

复制代码

3.批量管理组内线程

使用线程组自然是要对线程进行批量管理,比如可以批量中断组内线程,代码示例如下:

public class ThreadGroupTest {

public static void main(String[] args) {

ThreadGroup rootThreadGroup = new ThreadGroup("root线程组");

Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A");

Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B");

thread0.start();

thread1.start();

ThreadGroup threadGroup1 = new ThreadGroup(rootThreadGroup, "子线程组");

Thread thread2 = new Thread(threadGroup1, new MRunnable(), "线程C");

Thread thread3 = new Thread(threadGroup1, new MRunnable(), "线程D");

thread2.start();

thread3.start();

rootThreadGroup.interrupt();

System.out.println("批量中断组内线程");

}

}

class MRunnable implements Runnable {

@Override

public void run() {

while (!Thread.currentThread().isInterrupted()) {

System.out.println("线程名: " + Thread.currentThread().getName()

+ ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()

+ ", 父线程组: " + Thread.currentThread().getThreadGroup().getParent().getName());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

break;

}

}

System.out.println(Thread.currentThread().getName() + "执行结束");

}

}

复制代码

执行结果如下:

线程名: 线程A, 所在线程组: root线程组, 父线程组: main

线程名: 线程B, 所在线程组: root线程组, 父线程组: main

线程名: 线程C, 所在线程组: 子线程组, 父线程组: root线程组

线程名: 线程D, 所在线程组: 子线程组, 父线程组: root线程组

批量中断组内线程

线程A执行结束

线程B执行结束

线程C执行结束

线程D执行结束

复制代码

本文只是对Java中的ThreadGroup类进行了简单的介绍和使用示范,更多线程组的操作可以查看JDK API。

参考:

https://www.cnblogs.com/xrq730/p/4856072.html

https://www.cnblogs.com/barrywxx/p/9976417.html

最后,小编这里有一些架构资料可以分享给大家!

请加772300343领取!

谢谢关注!

java group类_浅析Java中线程组(ThreadGroup类)相关推荐

  1. java 线程组作用_浅析Java中线程组(ThreadGroup类)

    一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...

  2. java中随机数怎么定义类_浅析Java中的随机数类

    Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...

  3. java变量同名_浅析Java中局部变量与成员变量同名解决技巧

    要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中 ...

  4. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  5. java 越来越慢_浅析Java语言慢的原因

    Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论.我想就我自己的理解,谈一下影响Java ...

  6. Java的反射作用_浅析Java 反射机制的用途和缺点

    反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...

  7. java expression 用法_浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

  8. Java集合中线程安全的类

    集合中线程安全的类都是jdk1.1中的出现的.在jdk1.2之后,就出现许多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多了个同步化机制(线程安全),因为效率 ...

  9. 【java】java 线程组 ThreadGroup

    1.概述 转载:线程组是什么?线程优先级如何设置? 2. 线程组(ThreadGroup) Java中用ThreadGroup来表示线程组,我们可以使用线程组对线程进行批量控制. ThreadGrou ...

最新文章

  1. 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决
  2. oracle 方言报错,ORACLE11g:No Dialect mapping for JDBC type: -9解决方案详解
  3. 金融贷款逾期的模型构建7——模型融合
  4. 工作120:富文本组件封装
  5. python中的切片以及注意事项
  6. pycharm无缘无故打开Nosetest
  7. node.js中net网络模块TCP服务端与客户端的使用
  8. java mysql存储图片_Java存储图片到Mysql
  9. 北京市居住证办理问题的整理
  10. java中多线程介绍
  11. Linux系统安装教程(详细版)
  12. Debian服务器更改时区为中国
  13. 香港大学计算机科学排名,香港大学计算机专业排名
  14. Linux基础命令之tar解压缩详解
  15. 南邮 OJ 1652 翻转棋
  16. Nginx服务器安装
  17. Windows事件查看器_ID一览表
  18. Sql语句查询之内连接与外连接
  19. iOS 自定制搜索栏,保存历史搜索
  20. 第五次作业:《财务决策与分析》——财务分析的基本方法(慕课组)

热门文章

  1. 今年大事:年终汇算清缴,你是退还是补?惊喜还是惊吓?
  2. linux服务器密码策略,windows与linux服务器平台密码策略管理
  3. VS 动态库 导出C++类
  4. mxnet转onnx
  5. mxnet slice_axis
  6. Milvus Windows
  7. vs c# release调试
  8. torch.load invalid load key, ‘\x00‘
  9. 论文精读——CenterNet :Objects as Points
  10. 线性回归最小二乘法和梯度下降法-详细