【第68题】JAVA高级技术-多线程2(查看JVM中的线程名)

回城传送–》《JAVA筑基100例》

零、前言

​ 今天是学习 JAVA语言 打卡的第68天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

题目:查看JVM中线程的名称及其所在组的名称

二、解题思路

创建一个类:ThreadList

定义3个方法:

  • getRootThreadGroups():获得根线程组
  • getThreads() :获得给定线程组中所有线程名
  • getThreadGroups():获得线程组中所有线程

线程组:表示一个线程的集合。还有线程组是可以包含其他线程组的。

线程组构成一棵树,除了初始化的线程组外,每个线程组都有一个父线程组。

三、代码详解

package com.xiaoxuzhu;
import java.util.ArrayList;
import java.util.List;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/11.1	    xiaoxuzhu		2022/5/11		    Create
 * </pre>
 * @date 2022/5/11
 */

public class ThreadList {
    
    
    private static ThreadGroup getRootThreadGroups() {
    
    //获得根线程组
        ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();//获得当前线程组
        while (true) {
    
    
            if (rootGroup.getParent() != null) {
    
    //如果getParent()返回值非空则不是根线程组
                rootGroup = rootGroup.getParent();//获得父线程组
            } else {
    
    
                break;//如果到达根线程组则退出循环
            }
        }
        return rootGroup;//返回根线程组
    }
    public static List<String> getThreads(ThreadGroup group) {
    
    //获得给定线程组中所有线程名
        List<String> threadList = new ArrayList<String>();      //创建保存线程名的列表
        Thread[] threads = new Thread[group.activeCount()]; //根据活动线程数创建线程数组
        int count = group.enumerate(threads, false);//复制线程到线程数组
        for (int i = 0; i < count; i++) {
    
    //遍历线程数组将线程名及其所在组保存到列表中
            threadList.add(group.getName() + "线程组:" + threads[i].getName());
        }
        return threadList;//返回列表
    }
    public static List<String> getThreadGroups(ThreadGroup group) {
    
    //获得线程组中所有线程
        List<String> threadList = getThreads(group);    //获得给定线程组中线程名
        ThreadGroup[] groups = new ThreadGroup[group.activeGroupCount()];//创建线程组数组
        int count = group.enumerate(groups, false); //复制子线程组到线程组数据
        for (int i = 0; i < count; i++) {
    
    //遍历所有子线程组
            threadList.addAll(getThreads(groups[i]));// 利用getThreads()方法获得线程名列表
        }
        return threadList;//返回所有线程名
    }
    public static void main(String[] args) {
    
    
        for (String string : getThreadGroups(getRootThreadGroups())) {
    
    
            System.out.println(string);//遍历输出列表中的字符串
        }
    }
}

如图

四、推荐专栏

《JAVA从零到壹》

《JAVA筑基100例》

五、示例源码下载

关注下面的公众号,回复筑基+题目号

筑基68

猜你喜欢

转载自blog.csdn.net/shi_hong_fei_hei/article/details/124903043
今日推荐