java ThreadGroup的作用及方法详解
作者:知我饭否 发布时间:2022-02-03 16:49:01
标签:java,ThreadGroup
ThreadGroup的作用及方法
ThreadGroup线程组,java对这个类的描述呢就是
“线程组表示一组线程。此外,线程组还可以包括其他线程组。线程组形成一个树,其中除了初始线程组之外的每个线程组都有一个父线程组。
允许线程访问关于其线程组的信息,但不允许访问关于其线程组的父线程组或任何其他线程组的信息。”
ThreadGroup并不是算是标注容器,因为,最后你会发现这个家伙是没有public的 add,remove方法的。那怎么把线程放到线程组里面呢?
答案是 在new Thread(参数),将ThreadGroup当做参数传进去。
Field
private final ThreadGroup parent;// 线程组的线程组,final 表名 线程组 不可以随便变更
String name; //名字
int maxPriority;//这个线程组 的元素 例如 线程 线程组的最大优先级,具体实现是 当线程或者线程组自身设定优先级的时候,总是取 自己父线程组的优先级和要设定的优先级的最小值
boolean destroyed;//判断是否销毁了
boolean daemon;//当守护进程线程组的最后一个线程停止或最后一个线程组被销毁时,将自动销毁该线程组。
int nUnstartedThreads = 0;
int nthreads;//这个线程组 里面的线程数量
Thread threads[];//线程数组 ,持有 线程的引用
int ngroups;//这个线程组 里面的线程组数量
ThreadGroup groups[];//线程组数组 ,持有 线程组的引用
私有构造方法
创建不在任何线程组中的空线程组。
此方法用于创建系统线程组。
private ThreadGroup()
公共构造方法
//创建一个新线程组。这个新组的父线程组是指定的线程组parent。线程组的 名字 就是name
会对 parent 调用checkAccess() 确定当前运行的线程是否具有修改此线程组的权限(比如 设置setDaemon)。有可能会抛出SecurityException异常
public ThreadGroup(ThreadGroup parent, String name)
//构造一个新线程组。这个新组的父线程组是当前运行线程的线程组。 就是调用上面的方法
public ThreadGroup(String name) {
this(Thread.currentThread().getThreadGroup(), name);
}
公共方法
public final String getName()//返回线程组名字
//返回父线程组 parent 调用checkAccess() 确定当前运行的线程是否具有修改此线程组的权限。
//有可能会抛出SecurityException异常
public final ThreadGroup getParent()
public final int getMaxPriority() //返回线程组优先级
//测试此线程组是否是守护进程线程组。当守护进程线程组的最后一个线程停止或最后一个线程组被销毁时,将自动销毁该线程组。
public final boolean isDaemon()
public synchronized boolean isDestroyed()//测试该线程组是否已被销毁。
public final void setDaemon(boolean daemon)//将线程组设置成守护线程组 ,会检查 当前线程是否具有权限 修改线程组
//设定当前线程组以及子线程组的 优先级,取pri和当前线程组的父线程组的优先级的较小值为准。
//这个之所以会限制 Thread的最大优先级
//具体实现是 当线程或者线程组自身设定优先级的时候,总是取 自己父线程组的优先级和要设定的优先级的最小值
//会检查 当前线程是否具有权限 修改线程组
public final void setMaxPriority(int pri)
//测试,当前这个线程组是否是 g线程组的父线程 或者参数
public final boolean parentOf(ThreadGroup g)
//检查 当前线程是否具有权限 修改线程组 比如在当前线程中 用线程组自己本身调用它自己的一些方法 ,都会检查
public final void checkAccess()
//返回此线程组及其子线程组中活动线程数量的估计值。递归地遍历此线程组中的所有子组。 如果当前线程组已经destroyed,返回0
public int activeCount()
//将线程组的中线程 活动线程放入list[]里面 会自动扩大这个数组,如果{@code recurse}为{@code true},则此方法递归枚举此线程组的所有子组,并引用这些子组中的每个活动线程
//注意这个声明数组的方式
public int enumerate(Thread list[], boolean recurse)
//和上面方法类似 只不过 下面这个 ThreadGroup
public int enumerate(ThreadGroup list[])
public int enumerate(ThreadGroup list[], boolean recurse)
//返回此线程组及其子组中活动组的数量的估计值。递归地遍历此线程组中的所有子组。
public int activeGroupCount()
//interrupt此线程组中的所有线程。包括 子线程组中的线程
public final void interrupt()
特殊的一个方法
public void uncaughtException(Thread t, Throwable e)
这个方法呢,作用很简单 使 t 线程 抛出一个 Throwable e的异常。这个e 异常 也是你自己定义的。如果前面设置了,
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.out.println("默认的 "+t.getName());
System.out.println("默认的 "+e);
});
那么,在上面自定义的Throwable 会被这个捕获,如果没有设置,就打印标注错误流。对这个方法,存在的意义 比较困惑
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.out.println("默认的 "+t.getName());
System.out.println("默认的 "+e);
});
ThreadGroup threadGroup = new ThreadGroup("father");
Thread two = new Thread(threadGroup,"two");
threadGroup.uncaughtException(two,new IllegalAccessException("ssss"));
运行结果
线程组(ThreadGroup类)
线程组表示一个线程的集合。线程组也可以包含其他线程组。线程执行完就会被回收。
private static void methodA() {
MyThread my = new MyThread() ;
//创建线程类对象
Thread t1 = new Thread(my, "线程1") ;
Thread t2 = new Thread(my, "线程2") ;
//public final ThreadGroup getThreadGroup()返回该线程所属的线程组
ThreadGroup tg1 = t1.getThreadGroup() ;
ThreadGroup tg2 = t2.getThreadGroup() ;
//public final String getName():返回线程组的名称
System.out.println(tg1.getName()); //main
System.out.println(tg2.getName());//main
//所有的线程它默认的线程组名称:main(主线程),主线程是包含在线程组里面的
System.out.println(Thread.currentThread().getThreadGroup().getName());//main
}
private static void methodB() {
//public ThreadGroup(String name)构造一个新线程组
ThreadGroup tg = new ThreadGroup("新的线程组") ;
MyThread my = new MyThread() ;
//Thread(ThreadGroup group, Runnable target, String name)
Thread t1 = new Thread(tg, my, "线程1") ;
Thread t2 = new Thread(tg, my, "线程2") ;
//直接获取线程组名称
System.out.println(t1.getThreadGroup().getName());
System.out.println(t2.getThreadGroup().getName());
}
来源:https://blog.csdn.net/a1064072510/article/details/87455525


猜你喜欢
- Android 中 ActivityLifecycleCallbacks的实例详解  
- 美团外卖菜单界面的Android实现代码,供大家参考,具体内容如下布局文件总布局<?xml version="1.0&quo
- //计算字符串的MD5值 public string G
- RabbitMQ主要有六种种工作模式,本文整合SpringBoot分别介绍工作模式的实现。前提概念生产者消息生产者或者发送者,使用P表示:队
- 特性一:委托委托是C#语言 * 有的概念,相当于C/C++中的函数指针,与C/C++中函数指针的不同之处是:委托是面向对象的、类型安全的和保险
- 本文实例讲述了C#设置输入法的方法。分享给大家供大家参考。具体如下:private void Form1_Load(object sende
- 整型变量基本语法格式int变量名= 初始值;代码示例int a = 10;int表示变量的类型是一个整型。在 Java 中, 一个int变量
- 在最近的两个项目中,项目需求要求我们实现 /*登陆页面的内容能够随着键盘的弹出而被顶上去,避免键盘遮挡住登陆按钮*/ 这样的效果,宝宝心里苦
- 一、Mybatis中的延迟加载1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用associ
- 本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。1、日期时间字符串转换成毫秒@Testpublic void
- 本文实例为大家分享了android通过servlet上传文件到服务器的具体代码,供大家参考,具体内容如下服务器端:部署在Tomcat上,直接
- 引言朋友要查看一个已存在包的versionCode信息,在群里面询问,由于是已经存在的apk包,并且只需要其中的versionCode信息,
- 本文实例为大家分享了java排序算法之冒泡排序的具体代码,供大家参考,具体内容如下冒泡排序冒泡排序无疑是最为出名的排序算法之一,从序列的一端
- 前言在一些项目中,经常会遇到需要把当前线程中的上下文传递到其他线程中的情况,比如某项目包含国际化操作,在业务请求进来时需要把对应的国家代码存
- spring配置不扫描service层原因我将contoller给springmvc进行扫描,然后其余所有交给spring扫描然后发现ser
- 通常情况下我们想实现文字的走马灯效果需要在xml文件中这样设置<TextView android:layout_widt
- 最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动。下面通过此图给大家展示下效果,可能比文字描述
- 问题描述本来开发工具安装的是IDEA2018,有天用着用着突然崩溃了,重启后死活用不了。心血来潮下载了2019版本,顺利安装完,但是点击快捷
- 1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时
- 下面给大家分享一小段代码给大家介绍C# 输出字符串到文本文件中,具体代码如下所示: public class WriteHelp