java 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"));

运行结果

转:https://blog.csdn.net/a1064072510/article/details/87455525

原文地址:https://www.cnblogs.com/dayiran1222/p/10894809.html

时间: 2024-08-05 06:58:21

java ThreadGroup 作用 方法解析(转)的相关文章

JS和JAVA使用JSON方法解析

JS和JAVA使用JSON方法解析 一.JS部分================== 将json字符串转换为json对象的方法.在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键. 例如: JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; JSON对象: var str2 = {

JAVA中toString方法的作用

因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法 总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法 回答补充: 写这个方法的用途就是为了方便操作,所以在文件操作里面可用可不用 例子1: public class Orc { public st

【转】Java HashMap 源码解析(好文章)

- .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wrapper iframe, .fluid-width-video-wrapper object, .fluid-width-video-wrapper embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } [

Java IO流详尽解析(转自 http://www.2cto.com/kf/201312/262036.html)

流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表.字节流和字符流的区别

深入理解Java虚拟机笔记---方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作.在Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法的调用过程变得相对复杂,需要在类加载期间甚至到运行期间才能确定目标方法的直接引用.

分享:APK高级保护方法解析(一)

查天气.找美食.玩游戏.买电影票.网上购物--安装APP后,手机变成"百事通".不过,智能手机越来越"聪明",也越来越不安全,病毒感染.垃圾短信.隐私泄露等关乎手机用户切身利益的问题频发.保护手机安全,不仅需要用户到正规官网下载APP,更重要的是开发者要做好APK安全保护工作.                       http://write.blog.csdn.net/postedit 下面小编就分享一下APK高级保护的方法--运行时验证 运行时验证,主要是指

Java之final关键字解析

Java之final关键字解析 final关键字可以修饰不同的内容,这些内容仅包括一个变量,一个方法或者一个类,以下是final修饰这些内容的作用: final变量:表示该变量为常量,即只能初始化一次 final方法:表示该方法不能被重写 final类:表示该类不可以被继承 final变量 当一个变量被final关键字修饰时,意味着它的值不可以被修改了,也就是说,这个变量表示一个常量.这也意味着final变量必须被初始化.如果一个final变量表示的是一个对象的引用,那么该变量就不能重新表示另一

1.28 Java基础总结 ①方法重载②构造方法

1.28 Java基础总结 ①方法重载②构造方法 一.方法的重载在同一个类中,方法名相同,形参列表不同访问修饰符.返回类型和是否重载无关:按顺序对应的形参列表类型不同即可 二.构造器在类创建一个实例时被调用,构造方法只能用new关键字调用目的:初始化实例,初始化类属性(0,0.0,null,false)无返回值,和类名一致,用来构造对象作用:为对象分配内存, 创建并初始化成员变量(通过类创建,所以可以在static方法中调用构造方法) 返回引用,引用.属性:引用.方法(所以无返回值) 三.构造方

转:在java中使用dom4j解析xml

在java中使用dom4j解析xml 虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: <?xml version="1.0" encod