Java并发编程: Java线程组(ThreadGroup)

文章目录

  • 一、介绍
  • 二、线程组特性
    • 1、关联性
      • (1)一级关联性
      • (2)多级关联性
    • 2、自动归属属性
    • 3、根线程组
  • 三、线程组作用
    • 1、统一异常处理机制

一、介绍

Java线程组(ThreadGroup)是一种用于组织和管理线程的机制。它允许将多个线程组织成一个单元,从而更容易进行管理和控制。线程组的主要作用包括组织、控制、监视和安全性。通过线程组,可以将相似或相关的线程放在同一个组内,便于管理;可以对整个线程组执行操作,如挂起、恢复、中断等;可以获取线程组的状态信息,如活动线程数、线程组名称等;还可以用于设置安全性策略,限制组内线程的权限。ThreadGroup的实现的接口、构造函数和属性信息如下:
在这里插入图片描述

  • private final ThreadGroup parent:指向父线程组的引用。

  • String name:线程组的名字,用于标识和区分不同线程组。

  • int maxPriority:定义了该线程组内所有线程允许的最大优先级,当线程试图设置高于此值的优先级时,系统会将其自动调整为组内的最大优先级。
    在这里插入图片描述

  • boolean daemon:指示线程组是否为守护线程组,子线组程将继承这一属性,若为true,则当所有非守护线程终止后,守护线程也将结束。
    在这里插入图片描述

线程组可以形成一个层次结构,其中每个线程组都可以包含其他线程组和线程。
在这里插入图片描述

总的来说,Java线程组是一种强大的工具,用于有效地组织、管理和控制多线程环境中的线程行为。通过合理地使用线程组,可以提高程序的并发性和可维护性,从而更好地利用系统资源。

二、线程组特性

1、关联性

(1)一级关联性

线程直属于某一线程组,例如:
在这里插入图片描述

package chatpter03;

import java.util.concurrent.TimeUnit;
public class TestThreadGroup01 {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            System.out.println("running thread: " + Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        thread1.start();
        String name = thread1.getThreadGroup().getName();
        System.out.println(Thread.currentThread().getName() + "的 thread group name: " + name);
        String parentName = thread1.getThreadGroup().getParent().getName();
        System.out.println("parent thread gourp name: " + parentName);

    }
}

运行结果:

main的 thread group name: main
running thread: Thread-0
parent thread gourp name: system

Process finished with exit code 0

(2)多级关联性

线程组中的线程对象可以继续创建其他线程组,并形成一个层次结构。
在这里插入图片描述

package chatpter03;

import java.util.concurrent.TimeUnit;
public class TestThreadGroup02 {
    public static void main(String[] args) {
        ThreadGroup newThreadGroup = new ThreadGroup("newThreadGroup");
        Thread thread1 = new Thread(newThreadGroup, () -> {
            System.out.println("running thread: " + Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        Thread thread2 = new Thread(newThreadGroup, () -> {
            System.out.println("running thread: " + Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        thread1.start();

        thread2.start();
        String thread1GroupName = thread1.getThreadGroup().getName();
        String thread2GroupName = thread2.getThreadGroup().getName();
        System.out.println(thread1.getName() + "的 thread group name: " + thread1GroupName);
        System.out.println(thread2.getName() + "的 thread group name: " + thread2GroupName);
        String parentName1 = thread1.getThreadGroup().getParent().getName();
        String parentName = thread2.getThreadGroup().getParent().getName();
        System.out.println(thread1GroupName + " parent thread group name: " + parentName1);
        System.out.println(thread1GroupName + " parent thread group name: " + parentName);

    }
}

运行结果:

Thread-0的 thread group name: newThreadGroup
Thread-1的 thread group name: newThreadGroup
running thread: Thread-1
running thread: Thread-0
newThreadGroup parent thread group name: main
newThreadGroup parent thread group name: main

Process finished with exit code 0

2、自动归属属性

当您创建一个线程对象时,如果当前线程存在一个线程组,新创建的线程对象将自动成为当前线程所属线程组的一员

3、根线程组

main根线程组的名称为system
在这里插入图片描述
运行结果:

main的 thread group name: main
running thread: Thread-0

Process finished with exit code 0

三、线程组作用

1、统一异常处理机制

package chatpter03;

public class TestThreadGroup04 {
    public static void main(String[] args) {
        ThreadGroup newThreadGroup = new ThreadGroup("newThreadGroup") {
          @Override
          public void uncaughtException(Thread t, Throwable e) {
              System.out.println(t.getName() + " throw exception: " + e.getMessage());
          }
        };
        Thread thread1 = new Thread(newThreadGroup, () -> {
            System.out.println("running thread: " + Thread.currentThread().getName());
            throw new RuntimeException("throw my exception");
        });

        Thread thread2 = new Thread(newThreadGroup, () -> {
            System.out.println("running thread: " + Thread.currentThread().getName());
            int a = 1 / 0;
        });
        thread1.start();
        thread2.start();

    }
}

运行结果:

running thread: Thread-0
running thread: Thread-1
Thread-0 throw exception: throw my exception
Thread-1 throw exception: / by zero

Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机毕业设计】在线商品管理系统的设计与实现——后附源码

🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…

代码随想录算法训练营第三十四天| LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

一、LeetCode 1005.K次取反后最大化的数组和 题目链接/文章讲解/视频讲解:https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html 状态:已解决 1.思路 还是那个…

基于SpringBoot+vue的在线商城系统+论文+免费远程调试

基于SpringBootvue的在线商城系统034(含源码 数据库文档免费送) 开发系统:Windows10 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springb…

【SCI绘图】【热力图系列1 R】多特征相关性分析热力图R语言实现

SCI,CCF,EI及核心期刊绘图宝典,爆款持续更新,助力科研! 本期分享: 【SCI绘图】【热力图系列1 R】多特征相关性分析热力图R语言实现 1.环境准备 library(gplots) library(RColorBrewer) 2.数据示例 ###…

MySQL典型示例

目录 1.使用环境 2.设计表 3.创建表 4.准备数据 5.查询 1.使用环境 数据库:MySQL 8.0.30 客户端:Navicat 15.0.12 2.设计表 假设我们已经建好了一个名为test的数据库。我们添加如下几个表:教师、课程、学生、班级、成绩。实体联系图设…

菜狗学前端之JS高级笔记

老样子。复制上来的图片都没了,想看原版可以移步对应资源下载(资源刚上传,还在审核中) (免费) JS高级笔记https://download.csdn.net/download/m0_58355897/89102910 一些前提概念 一 什么是js高级 js高级是对js基础语法的一个补充说明,本质…

C语言从入门到实战————文件操作

目录 前言 1. 为什么使用文件? 2. 什么是文件? 2.1 程序文件 2.2 数据文件 2.3 文件名 3. ⼆进制文件和文本文件? 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文…

DSP报错#10099-D</a> program will not fit into available memory

DSP报错#10099-D程序将无法放入可用内存 问题解决方法后续 问题 开发TMS320Fxxxxx出现以下问题&#xff1a; <a href"file:/D:/TI/ti/ccs/tools/compiler/dmed/HTML/10099.html">#10099-D</a> program will not fit into available memory, or the se…

P5200A泰克P5200A高压差分探头

181/2461/8938产品概述&#xff1a; 特点: 1.3 kV差分1 kV至地&#xff08;每个通道&#xff09;50 MHz带宽50倍/500倍衰减UL认证3111-1IEC 1010认证不再不安全地浮动您的范围出色的信号保真度轻松连接IC和汇流条对用户和DUT安全由9 VDC墙壁适配器供电超量程指示器安全认证可…

rhce复习3

DNS DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听的port。DNS使用的是53端口&#x…

SRIO学习(1)SRIO介绍以及IP核详解

文章目录 一、SRIO介绍1.1、概要1.2、RapidIO与传统嵌入互连方式的比较1.3、串行RapidIO协议&#xff08;SRIO&#xff09; 二、RapidIO协议结构及包格式2.1、逻辑层2.2 传输层2.3 物理层 三、IP核详解3.1、逻辑层3.1.1 I/O端口3.1.2 消息&#xff08;Message&#xff09;端口3…

【云呐】工单管理流程,工单管理怎么处理

工单创建  客户或内部员工在系统中创建工单。工单应包括以下信息&#xff1a;  问题的描述  工单的优先级和紧急程度  相关的客户或内部员工信息  工单的类型或类别  相关的附件或文件 工单分配  工单需要分配给适当的人员或团队来解决。分配过程可能涉及到以下步…

龙蜥社区「人人都可以参与开源」—— 走进“龙蜥社区”感受开源魅力

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 开源这个关键字我相信各位开发者们或多或少都听说过&#xff0c;简单来讲开源就是源码开放&#xff0c;但是不意味着使…

【DM8】间隔分区

是范围分区的一个扩展 如果使用了间隔函数做分区&#xff0c;在数据插入的时候&#xff0c;如果没有合适的分区&#xff0c;数据库会自动创建一个新的分区。 –year往后推两年 SELECT SYSDATE numtoyminterval(2,‘YEAR’); –month往后推两年 SELECT SYSDATE numtoyminterv…

交换机与队列的介绍

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…

智慧园区预付费4G水电表管理系统

智慧园区预付费4G水电表管理系统&#xff0c;作为智慧城市建设的重点之一&#xff0c;利用4G通信技术对园区内的水电使用进行实时监控和管理。这种系统借助现代通信技术和物联网的发展&#xff0c;为园区水电能源的预付费、计量、监控和管理提供了新的解决方案。本文将从该系统…

750万人受影响,印度电子巨头boAt重大数据泄露事件

近日&#xff0c;印度消费电子巨头boAt遭遇重大数据泄露事件&#xff0c;超过750万客户的个人数据遭到泄露&#xff0c;泄露的个人数据包括姓名、地址、联系电话、电子邮件 ID 和客户 ID 以及其他敏感信息&#xff0c;目前这些泄露数据正在暗网上流传。 boAt Lifestyle数据库被…

vue项目初始化和部署

目录 1. 技术简介... 2 2. 安装Node.js. 3 3. 全局安装Vue CLI (脚手架工具) 5 4. 创建一个新的Vue项目... 6 5. 在阿里云虚拟机安装和配置Nginx. 9 6. 将Vue项目打包部署到Nginx下... 14 7. 访问部署的项目... 14 1. 技术简介 Vue.js&#xff08;通常简称为Vue&#x…

vue3 +Taro 页面实现scroll-view 分页功能

需求 现在分页列表 后端只给你一个分页的数据列表 没有总页数 没有当前的分页 页数 只有这么一个list 、、、 如何去分页 我这使用的是scroll-view 组件 滑动到底部的事件 根据你当前设定的每页的数据数量和后端返回给你的数据列表数量 当某一次分页 两个数量不相等了以后 就…

群晖NAS使用Docker部署Potopea在线图片编辑工具并实现公网访问

文章目录 1. 部署Photopea2. 运行Photopea3. 群晖安装Cpolar4. 配置公网地址5. 公网访问测试6. 固定公网地址 本文主要介绍如何在群晖NAS使用Docker部署Potopea在线图片编辑工具&#xff0c;并结合cpolar内网穿透实现公网环境可以远程访问本地部署的Potopea. Photopea是一款强大…