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中线程组(ThreadGroup类)的更多相关文章

  1. JDK中线程组ThreadGroup

    如果线程有100条...分散的不好管理... 线程同样可以分组ThreadGroup类. 线程组表示一个线程的集合.此外,线程组也可以包含其他线程组.线程组构成一棵树,在树中,除了初始线程组外,每个线 ...

  2. java 多线程 线程组ThreadGroup;多线程的异常处理。interrupt批量停止组内线程;线程组异常处理

    1,线程组定义: 线程组存在的意义,首要原因是安全.java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的.但如果在不同的线程组中,那么就不能"跨线程组&q ...

  3. 线程组ThreadGroup分析详解 多线程中篇(三)

    线程组,顾名思义,就是线程的组,逻辑类似项目组,用于管理项目成员,线程组就是用来管理线程. 每个线程都会有一个线程组,如果没有设置将会有些默认的初始化设置 而在java中线程组则是使用类ThreadG ...

  4. “全栈2019”Java多线程第十三章:线程组ThreadGroup详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. 线程组ThreadGroup

      ThreadGroup线程组表示一个线程的集合.此外,线程组也可以包含其他线程组. 线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组. 允许线程访问有关自己的线程组的信息,但 ...

  6. 多线程(三) java中线程的简单使用

    java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依 ...

  7. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  8. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  9. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

随机推荐

  1. call , apply的this指向实现原理并自己实现封装

    实现this指向原理 var value = 'value' var obj = { value: 'obj' } function func() { console.log(this.value) ...

  2. Kali 无线网络

    WiFi——必备的一个东西: AP:这是无线用户接入到互联网的设备 ESSID:可以用于无限局域网中的多个AP中 BSSID:每个AP的唯一标识符 SSID:网络名称 Channels Wi-Fi可以 ...

  3. nuget 包管理器

    nuget 是.Net平台上的包管理器, 对于包的发布(打包 package)和消费(下载依赖管理)都有很好的支持, 本文仅仅关注消费端, =======================nuget项目 ...

  4. [Go] golang实现mysql连接池

    golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连 ...

  5. linux SSH设置

    环境:centos7 一. ssh连接超时设置 (1)客户端设置(推荐) 客户端是windows系统 连接工具:SecureCRT 1.SecureCRT客户端->Options(选项)-> ...

  6. 01day-webpack

    <!-- .sass后缀的文件名 比较老了 现在它的后缀名是.scss 其实他们是同一个东西 只是 后缀名发生了变化 以 .sass写的文件的内容是 他没有括号 没有分号 有点怪 它跟新为了.s ...

  7. nm U -l库的

    nm U -l库的

  8. gyp --depth . -D component=shared_library -Ibuild/standalone.gypi build/all.gyp

    gyp --depth . -D component=shared_library -Ibuild/standalone.gypi build/all.gyp

  9. idea之前的版本

    https://www.jetbrains.com/idea/download/previous.html

  10. Python学习笔记3 函数_20170614

    # 函数 定义 def my_abs(x) : if not isinstance(x, (int, float)) : raise TypeError('bad operand type') if ...