千家信息网

java高并发中线程组有什么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍java高并发中线程组有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!线程组我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程
千家信息网最后更新 2026年11月01日java高并发中线程组有什么用

这篇文章主要介绍java高并发中线程组有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

线程组

我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图:

使用线程组可以方便管理线程,线程组提供了一些方法方便方便我们管理线程。

创建线程关联线程组

创建线程的时候,可以给线程指定一个线程组,代码如下:

package com.itsoku.chat02;   import java.util.concurrent.TimeUnit;      /**      * <b>description</b>:<br>   * <b>time</b>:2019/7/13 17:53 <br>        * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!        */        public class Demo1 {         public static class R1 implements Runnable {              @Override               public void run() {                  System.out.println("threadName:" + Thread.currentThread().getName());                   try {                      TimeUnit.SECONDS.sleep(3);                  } catch (InterruptedException e) {                  e.printStackTrace();                }               }           }           public static void main(String[] args) throws InterruptedException {         ThreadGroup threadGroup = new ThreadGroup("thread-group-1");              Thread t1 = new Thread(threadGroup, new R1(), "t1");               Thread t2 = new Thread(threadGroup, new R1(), "t2");               t1.start();             t2.start();             TimeUnit.SECONDS.sleep(1);              System.out.println("活动线程数:" + threadGroup.activeCount());           System.out.println("活动线程组:" + threadGroup.activeGroupCount());              System.out.println("线程组名称:" + threadGroup.getName());           }       }

输出结果:

threadName:t1
threadName:t2
活动线程数:2
活动线程组:0
线程组名称:thread-group-1

activeCount()方法可以返回线程组中的所有活动线程数,包含下面的所有子孙节点的线程,由于线程组中的线程是动态变化的,这个值只能是一个估算值。

为线程组指定父线程组

创建线程组的时候,可以给其指定一个父线程组,也可以不指定,如果不指定父线程组,则父线程组为当前线程的线程组,java api有2个常用的构造方法用来创建线程组:

public ThreadGroup(String name)    public ThreadGroup(ThreadGroup parent, String name)

第一个构造方法未指定父线程组,看一下内部的实现:

public ThreadGroup(String name) {           this(Thread.currentThread().getThreadGroup(), name);           }

系统自动获取当前线程的线程组作为默认父线程组。

上一段示例代码:

package com.itsoku.chat02;   import java.util.concurrent.TimeUnit;      /**      * <b>description</b>:<br>   * <b>time</b>:2019/7/13 17:53 <br>        * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!        */        public class Demo2 {         public static class R1 implements Runnable {              @Override               public void run() {                  Thread thread = Thread.currentThread();              System.out.println("所属线程组:" + thread.getThreadGroup().getName() + ",线程名称:" + thread.getName());                   try {                      TimeUnit.SECONDS.sleep(3);                  } catch (InterruptedException e) {                  e.printStackTrace();                }               }           }           public static void main(String[] args) throws InterruptedException {         ThreadGroup threadGroup1 = new ThreadGroup("thread-group-1");             Thread t1 = new Thread(threadGroup1, new R1(), "t1");              Thread t2 = new Thread(threadGroup1, new R1(), "t2");              t1.start();             t2.start();             TimeUnit.SECONDS.sleep(1);              System.out.println("threadGroup1活动线程数:" + threadGroup1.activeCount());              System.out.println("threadGroup1活动线程组:" + threadGroup1.activeGroupCount());         System.out.println("threadGroup1线程组名称:" + threadGroup1.getName());          System.out.println("threadGroup1父线程组名称:" + threadGroup1.getParent().getName());             System.out.println("----------------------");         ThreadGroup threadGroup2 = new ThreadGroup(threadGroup1, "thread-group-2");          Thread t3 = new Thread(threadGroup2, new R1(), "t3");              Thread t4 = new Thread(threadGroup2, new R1(), "t4");              t3.start();             t4.start();             TimeUnit.SECONDS.sleep(1);              System.out.println("threadGroup2活动线程数:" + threadGroup2.activeCount());              System.out.println("threadGroup2活动线程组:" + threadGroup2.activeGroupCount());         System.out.println("threadGroup2线程组名称:" + threadGroup2.getName());          System.out.println("threadGroup2父线程组名称:" + threadGroup2.getParent().getName());             System.out.println("----------------------");         System.out.println("threadGroup1活动线程数:" + threadGroup1.activeCount());              System.out.println("threadGroup1活动线程组:" + threadGroup1.activeGroupCount());         System.out.println("----------------------");         threadGroup1.list();        }       }

输出结果:

所属线程组:thread-group-1,线程名称:t1
所属线程组:thread-group-1,线程名称:t2
threadGroup1活动线程数:2
threadGroup1活动线程组:0
threadGroup1线程组名称:thread-group-1
threadGroup1父线程组名称:main
----------------------
所属线程组:thread-group-2,线程名称:t4
所属线程组:thread-group-2,线程名称:t3
threadGroup2活动线程数:2
threadGroup2活动线程组:0
threadGroup2线程组名称:thread-group-2
threadGroup2父线程组名称:thread-group-1
----------------------
threadGroup1活动线程数:4
threadGroup1活动线程组:1
----------------------
java.lang.ThreadGroup[name=thread-group-1,maxpri=10]
Thread[t1,5,thread-group-1]
Thread[t2,5,thread-group-1]
java.lang.ThreadGroup[name=thread-group-2,maxpri=10]
Thread[t3,5,thread-group-2]
Thread[t4,5,thread-group-2]

代码解释:

1.threadGroup1未指定父线程组,系统获取了主线程的线程组作为threadGroup1的父线程组,输出结果中是:main

2.threadGroup1为threadGroup2的父线程组

3.threadGroup1活动线程数为4,包含了threadGroup1线程组中的t1、t2,以及子线程组threadGroup2中的t3、t4

4.线程组的list()方法,将线程组中的所有子孙节点信息输出到控制台,用于调试使用

根线程组

获取根线程组

package com.itsoku.chat02;  /**      * <b>description</b>:<br>   * <b>time</b>:2019/7/13 17:53 <br>        * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!        */        public class Demo3 {         public static void main(String[] args) {               System.out.println(Thread.currentThread());             System.out.println(Thread.currentThread().getThreadGroup());            System.out.println(Thread.currentThread().getThreadGroup().getParent());                System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent());        }       }

运行上面代码,输出:

Thread[main,5,main]
java.lang.ThreadGroup[name=main,maxpri=10]
java.lang.ThreadGroup[name=system,maxpri=10]
null

从上面代码可以看出:

1.主线程的线程组为main

2.根线程组为system

看一下ThreadGroup的源码:

private ThreadGroup() {     // called from C code            this.name = "system";               this.maxPriority = Thread.MAX_PRIORITY;               this.parent = null;       }

发现ThreadGroup默认构造方法是private的,是由c调用的,创建的正是system线程组。

批量停止线程

调用线程组interrupt(),会将线程组树下的所有子孙线程中断标志置为true,可以用来批量中断线程。

示例代码:

package com.itsoku.chat02;       import java.util.concurrent.TimeUnit;      /**      * <b>description</b>:<br>   * <b>time</b>:2019/7/13 17:53 <br>        * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!        */        public class Demo4 {         public static class R1 implements Runnable {              @Override               public void run() {                  Thread thread = Thread.currentThread();              System.out.println("所属线程组:" + thread.getThreadGroup().getName() + ",线程名称:" + thread.getName());                   while (!thread.isInterrupted()) {                     ;                   }                   System.out.println("线程:" + thread.getName() + "停止了!");          }           }           public static void main(String[] args) throws InterruptedException {         ThreadGroup threadGroup1 = new ThreadGroup("thread-group-1");             Thread t1 = new Thread(threadGroup1, new R1(), "t1");              Thread t2 = new Thread(threadGroup1, new R1(), "t2");              t1.start();             t2.start();             ThreadGroup threadGroup2 = new ThreadGroup(threadGroup1, "thread-group-2");          Thread t3 = new Thread(threadGroup2, new R1(), "t3");              Thread t4 = new Thread(threadGroup2, new R1(), "t4");              t3.start();             t4.start();             TimeUnit.SECONDS.sleep(1);              System.out.println("-----------threadGroup1信息-----------");           threadGroup1.list();            System.out.println("----------------------");         System.out.println("停止线程组:" + threadGroup1.getName() + "中的所有子孙线程");             threadGroup1.interrupt();               TimeUnit.SECONDS.sleep(2);              System.out.println("----------threadGroup1停止后,输出信息------------");             threadGroup1.list();        }       }

输出:

所属线程组:thread-group-1,线程名称:t1
所属线程组:thread-group-1,线程名称:t2
所属线程组:thread-group-2,线程名称:t3
所属线程组:thread-group-2,线程名称:t4
-----------threadGroup1信息-----------
java.lang.ThreadGroup[name=thread-group-1,maxpri=10]
Thread[t1,5,thread-group-1]
Thread[t2,5,thread-group-1]
java.lang.ThreadGroup[name=thread-group-2,maxpri=10]
Thread[t3,5,thread-group-2]
Thread[t4,5,thread-group-2]
----------------------
停止线程组:thread-group-1中的所有子孙线程
线程:t4停止了!
线程:t2停止了!
线程:t1停止了!
线程:t3停止了!
----------threadGroup1停止后,输出信息------------
java.lang.ThreadGroup[name=thread-group-1,maxpri=10]
java.lang.ThreadGroup[name=thread-group-2,maxpri=10]

停止线程之后,通过list()方法可以看出输出的信息中不包含已结束的线程了。

以上是"java高并发中线程组有什么用"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

线程 名称 活动 所属 输出 方法 代码 信息 子孙 事务 任务 公众 分布式 分库 分表 技术 数据 消息 爬虫 路人 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网与科技 广州淘业互联网络科技 上海卓越科技互联网 A股互联网金融科技公司 艾特科技互联网 互联网养老 桔豆科技 栖莱科技互联网股份有限公司 昊天互联网科技有限公司 青岛科技大学互联网大赛研究生 苏州铭阳互联网科技有限公司 深圳市优智互联网科技有限公司 中国互联网有什么科技 广州富喜互联网络科技 江苏互联网智能科技软件 上海创道互联网络科技有限公司 云鲸互联网络科技有限公司 科技互联网行业投资研究 恒生科技指数 中概互联网 陕西彩京云互联网科技有限公司 山东亿川互联网科技有限责任公司 互联网科技巨头监管 互联网 科技公司 兼蜜互联网科技 四个字互联网科技公司取名 互联网实体化科技化 互联网与数字科技关系 同城互联网络科技 科技和互联网行业的特点 广西泛欧互联网科技有限公司 科技发展第三阶段互联网时代
0