java线程组

news2024/11/17 6:31:20

文章目录

    • 1. 简介
    • 2. 线程对象关联线程组:一级关联
    • 3. 线程对象关联线程组:多级关联
    • 4. 自动归属属性
    • 5. 获取根线程组

1. 简介

为了方便某些具有相同功能的线程进行管理,我们可以把线程归属到某一个线程组。线程组中可以有线程对象、线程,类似于树的形式。Java线程组(Thread Group)是一种用于组织线程的机制。线程组可以将一组线程作为一个单元进行管理,并且可以方便地对这组线程进行控制和监视。线程组可以形成一个层次结构,其中每个线程组都可以包含其他线程组和线程。线程组提供了以下功能:

  • 线程组可以用于设置线程的优先级、守护状态和未捕获异常处理器。
  • 可以通过调用线程组的interrupt()方法中断线程组中的所有线程。
  • 可以通过调用线程组的stop()方法停止线程组中的所有线程。
  • 可以使用线程组的enumerate()方法获取线程组中的所有线程。
    在这里插入图片描述

线程组的作用就是可以批量的管理线程或线程对象,有效地对线程或者线程对象进行组织。

2. 线程对象关联线程组:一级关联

在Java中,线程组中的一级关联是指将线程对象直接添加到线程组中。一级关联意味着线程对象直接属于线程组,而不是其他线程对象的子线程。当将线程对象添加到线程组中时,该线程对象成为线程组的成员,可以通过线程组来管理和控制该线程对象。线程组可以对其成员线程执行一些集体操作,例如设置优先级、中断、停止等。线程组中的一级关联可以使用以下构造函数来实现:

ThreadGroup(ThreadGroup parent, String name)

测试代码如下:

public class Main {
    public static void main(String[] args) {
        // 创建线程组
        ThreadGroup threadGroup = new ThreadGroup("MyThreadGroup");
        // 创建线程,并将线程添加到线程组
        Thread thread1 = new Thread(threadGroup, new MyThread(), "Thread 1");
        Thread thread2 = new Thread(threadGroup, new MyThread(), "Thread 2");
        // 启动线程
        thread1.start();
        thread2.start();
        // 输出线程组中的活动线程数
        System.out.println("Active threads in Thread Group: " + threadGroup.activeCount());
        // 输出线程组的名称
        System.out.println("Thread Group Name: " + threadGroup.getName());
        // 列举线程组中的线程
        Thread[] threads = new Thread[threadGroup.activeCount()];
        threadGroup.enumerate(threads);
        System.out.println("Threads in Thread Group:");
        for (Thread thread : threads) {
            System.out.println(thread.getName());
        }
    }
}

class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println("Thread: " + Thread.currentThread().getName() + " is running.");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述

3. 线程对象关联线程组:多级关联

多级关联是指线程组中的线程对象可以继续创建其他线程组,并形成一个层次结构。通过多级关联,可以更好地组织和管理线程,形成更复杂的线程结构。

public class Main implements Runnable{
    public void run() {
        System.out.println("Thread: " + Thread.currentThread().getName() + " is running.");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        // 创建顶级线程组
        ThreadGroup parentGroup = new ThreadGroup("ParentThreadGroup");

        // 创建子线程组
        ThreadGroup childGroup1 = new ThreadGroup(parentGroup, "ChildThreadGroup1");
        ThreadGroup childGroup2 = new ThreadGroup(parentGroup, "ChildThreadGroup2");

        // 创建线程,并将线程添加到子线程组
        Thread thread1 = new Thread(childGroup1, new Main(), "Thread 1");
        Thread thread2 = new Thread(childGroup2, new Main(), "Thread 2");

        // 启动线程
        thread1.start();
        thread2.start();
        

        // 输出线程组的名称和活动线程数
        System.out.println("Parent Thread Group Name: " + parentGroup.getName());
        System.out.println("Child Thread Group 1 Name: " + childGroup1.getName());
        System.out.println("Child Thread Group 2 Name: " + childGroup2.getName());
        System.out.println("Active threads in Parent Thread Group: " + parentGroup.activeCount());

        // 列举父线程组中的线程
        Thread[] parentThreads = new Thread[parentGroup.activeCount()];
        parentGroup.enumerate(parentThreads);
        System.out.println("Threads in Parent Thread Group:");
        for (Thread thread : parentThreads) {
            System.out.println(thread.getName());
        }

        // 列举子线程组1中的线程
        Thread[] childThreads1 = new Thread[childGroup1.activeCount()];
        childGroup1.enumerate(childThreads1);
        System.out.println("Threads in Child Thread Group 1:");
        for (Thread thread : childThreads1) {
            System.out.println(thread.getName());
        }

        // 列举子线程组2中的线程
        Thread[] childThreads2 = new Thread[childGroup2.activeCount()];
        childGroup2.enumerate(childThreads2);
        System.out.println("Threads in Child Thread Group 2:");
        for (Thread thread : childThreads2) {
            System.out.println(thread.getName());
        }
    }
}

在这里插入图片描述

4. 自动归属属性

在Java中,线程对象具有自动归属属性(Automatic Thread Grouping),这意味着在创建线程对象时,它会自动归属于其创建线程的线程组。当您创建一个线程对象时,如果当前线程存在一个线程组,新创建的线程对象将自动成为当前线程所属线程组的一员。这种自动归属属性可以简化线程组的管理,无需显式指定线程组。

public class Main implements Runnable{
    public void run() {
        ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
        System.out.println("Thread: " + Thread.currentThread().getName() + " belongs to Thread Group: " + threadGroup.getName());
    }

    public static void main(String[] args) {
        //看看主线程属于哪个组
        ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
        System.out.println("Main Thread: " + Thread.currentThread().getName() + " belongs to Thread Group: " + threadGroup.getName());
        // 创建线程
        Thread thread1 = new Thread(new Main(), "Thread 1");
        Thread thread2 = new Thread(new Main(), "Thread 2");

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

在这里插入图片描述

5. 获取根线程组

上面的方法我们知道了Main线程属于Main线程组,那么Main线程组的父线程组是什么,我们研究一下

public class Main{
    public static void main(String[] args) {
        //看看主线程属于哪个组
        ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
        System.out.println("Main Thread: " + Thread.currentThread().getName() + " belongs to Thread Group: " + threadGroup.getName());
        System.out.println("Main Thread`s Parent ThreadGroup is:"+Thread.currentThread().getThreadGroup().getParent().getName());
        System.out.println("Main Thread`s GrandParent ThreadGroup is:"+Thread.currentThread().getThreadGroup().getParent().getParent().getName());
    }
}

可见Main线程的父线程组是System线程组,再取父线程则出现空异常

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【三维激光扫描】实验03:点云着色渲染模式详解

在SiScan软件中,点云的着色模式有:高程彩色、倾斜度、反射强度、自有颜色、点云测站、分隔片、分类7中,本文进行详细讲解。 文章目录 一、高程彩色二、倾斜度三、反射强度四、自有颜色五、分隔片一、高程彩色 高程彩色模式是按点云数据的Z值起算,颜色渐变显示。 二、倾斜度…

【AIGC】10、Chinese CLIP | 专为中文图文匹配设计

文章目录 一、背景二、方法2.1 基础内容2.2 数据集2.3 预训练方法2.4 模型尺寸 三、效果 论文:Chinese CLIP: Contrastive Vision-Language Pretraining in Chinese 代码:https://github.com/OFA-Sys/Chinese-CLIP 出处:阿里达摩院 时间&a…

061:cesium设置棋盘图材质(material-5)

第061个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置棋盘材质,请参考源代码,了解CheckerboardMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考:专栏目标…

第09章_子查询

第09章_子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果…

SeaweedFs使用-环境准备

SeaweedFs使用-环境准备 1.下载go语言包实现go语言环境2.下载SeaweedFs文件3.安装SeaweedFs SeaweedFs是一款开源的分布式存储软件,在存储大量小文件方面有更好的优化,比较适合存储web项目的图片等文件。 1.下载go语言包实现go语言环境 因为SeaweedFs是…

实战TCP三次握手

开篇 在几乎所有的后端开发面试题中,TCP三次握手绝对是最被面试官青睐的题目之一。但是这个东西,平时开发中看不见,摸不着,对于很多人来说,是纯理论的知识,玄之又玄。但是为了应对面试,又不得不…

《JavaEE》网络编程TCP/IP五层协议万字详解

文章目录 TCP/IP五层协议栈应用层xml (可读性比较好 但是运行效率不高)json(可读性好 但是运行效率不高)prtobuffer(可读性不好 但是运行效率很高) 传输层UDP TCPTCP数据解读32位序号32位确认序号4位首部的长度保留位6位标志位字段…

C语言实现学生管理系统

学习完C语言之后,我们可以通过简单写一个学生管理系统来检验自己学的怎么样。很多计算机系大学生都会学到C语言,对于C语言课程的设计作业可能会感到困难,该篇博客的核心点就是带领读者单独完成学生管理系统,此篇博客附有整个学生管…

【C++ 入坑指南】(11)指针

文章目录 一、概念定义和使用二、空指针 & 野指针2.1 空指针2.2 野指针2.3 小结 三、const 修饰的指针四、指针 和 数组五、指针和函数六、实例 学习 C 的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态…

数据全生命周期管理

数据存储 时代"海纳百川,有容乃大"意味结构化、半结构和非结构化多样化的海量的 ,也意味着批数据和流数据多种数据形式的存储和计算。面对不同数据结构、数据形式、时效性与性能要求和存储与计算成本等因素考虑,应该使用适合的存储…

组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python)

组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python) 目录 组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 ARIMA-CNN-LSTM是一种结合了传统时间序列模型和深度学习模型的…

chatgpt赋能Python-python3的下载

Python 3-您在编程路上不可或缺的伙伴 如果您正在寻找一种流行的编程语言,那么Python 3就是一个不错的选择。Python 3作为一种高级编程语言,可以轻松地创建各种应用程序和网站。它是最受欢迎的编程语言之一,就是因为它易于学习和使用。 Pyt…

本地部署 VisualGLM-6B

本地部署 VisualGLM-6B 1. 什么是 VisualGLM-6B2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 VisualGLM-6B6. 启动 VisualGLM-6B7. 访问 VisualGLM-6B8. API部署9. 命令行部署 1. 什么是 VisualGLM-6B VisualGLM-6B 是一个开源的,支持图像、中文和英文…

大模型时代下智能文档处理核心技术大揭秘

大模型时代下智能文档处理核心技术大揭秘 前言一张图全览文档图像分析与预处理图像预处理的整体架构核心技术点应用场景 版面分析与还原整体架构核心技术点应用场景 AI安全文档图像篡改检测 大模型时代思考总结 前言 最近,中国图像图形大会在苏州圆满结束&#xff0…

碳交易机制下考虑需求响应的综合能源系统优化运行(matlab代码)

目录 1 主要内容 架构模型: 需求响应模型: 目标函数: 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序复现文献《碳交易机制下考虑需求响应的综合能源系统优化运行》,解决碳交易机制下考虑需求响应的综合能源系统优化…

Emacs之快速高亮查找字符(九十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

ubuntu22.04静态ip设置(桥接模式、only-host+NAT模式)

在创建一台虚拟机后,默认的方式往往是通过DHCP动态的进行分配,DHCP服务器会告知创建的虚拟机分配到的ip地址,网关地址等信息。所以在创建好虚拟机之后,这些信息都不需要我们来配置,我们直接用就好了。 但是&#xff0…

redis集群之hash槽分析算法

上文提过了 hash取余算法和hash一致性算法 一致性hash算法是为了减少节点数目发生改变时尽可能的减少数据迁移 将所有的存储节点排在首位相连的Hash环上,每个key在计算hash后会顺时针找到临近的存储节点。 而当有节点加入或退出时,仅影响该节点在hash环上…

chatgpt赋能Python-python3求平均值

Python3求平均值-从基础到实践 Python3作为一种广泛使用的编程语言,被广泛应用于不同的领域。今天我们将探讨如何使用Python3求平均值。求平均值在数学和统计学中非常常见,使我们能够了解数据的中心趋势,并简化数据分析过程。让我们深入了解…

DELPHI7实现XP菜单风格

在DELPHI7中不使用任何第三方控件,实现放在工具栏上可拖动的XP风格菜单 今天有点空闲时间,顺便写点东西,不是什么深奥的东西,但实用,对于不想第三方控件但又想加点效果的朋友可能有点用.实现的效果如图: 步骤一:把Win32面板上把CoolBar组件加到窗体上 步骤二:把Additional面板上…