java线程基础巩固---ThreadGroup API学习
ThreadGroup初识:
这次来学习一个新的线程概念---线程组(ThreadGroup),首先从JDK文档中对它进行一个大致的了解,如下:

下面开始用代码来进行说明,对于一个线程来说如果没有指定其线程组,那它就属于当前线程所属的线程组,对于main()方法中的当前线程我们知道是main线程,那它的线程组又是啥呢,看下面:

接下来定义一个ThreadGroup:

其中在ThreadGroup的javadoc有如下描述:

那咱们来试着在新创建的线程中来访问我们指定的线程组中的一些信息,如下:

其中可以看到我们新建的线程组的父线程就是咱们当前线程所属的线程组,为什么?因为:

接下来再新建一个线程组:

接着再来看javadoc上的另一句关于线程组的说明:

那接下来论证一下吧:

目前是访问当前线程父线程组,那如果访问其它线程组呢?

编译运行:

所以上面官网的两条说明从实验当中貌似都不成立。
ThreadGroup常用API介绍:
activeCount():

这个在上面已经用到了,这里再来试验一下:

编译运行:

activeGroupCount():


编译运行:

checkAccess():

试试下:

destroy():

那咱们来试一下线程组不是空的情况下:



这个在上面已经用到过了,再来用一下:

enumerate(Thread[] list, boolean recurse):

为了能看出recurse参数为true和false的区别,下面以主线程为例进行实验:


interrupt():


那下面来瞅一下:
public class ThreadGroupApi {
public static void main(String[] args) {
ThreadGroup threadGroup = new ThreadGroup("TG1");
Thread t1 = new Thread(threadGroup, "T1") {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t1.start();
ThreadGroup threadGroup2 = new ThreadGroup(threadGroup, "TG2");
Thread t2 = new Thread(threadGroup2, "T2") {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t2.start();
// System.out.println(threadGroup.activeCount());
// System.out.println(threadGroup.activeGroupCount());
// threadGroup2.checkAccess();
//// threadGroup.destroy();
//
// System.out.println("====================");
// Thread[] threads = new Thread[threadGroup.activeCount()];
// threadGroup.enumerate(threads);
// Arrays.asList(threads).forEach(System.out::println);
//
// System.out.println("====================");
// threads = new Thread[10];
// Thread.currentThread().getThreadGroup().enumerate(threads, false);
// Arrays.asList(threads).forEach(System.out::println);
threadGroup.interrupt();
}
}
其中TG1线程组包含一个子TG2线程组,也就是有两个线程,那结果这两个线程会被打断么,运行一下呗:

果真如此~
setDaemon(boolean daemon):

那下面来实验一下:


确实是守护线程组会随着它里面的最后线程执行完而消亡,那如果不设置成守护呢?


这时线程组就没有被销毁了,此时需要手动的去销毁它,如下:

java线程基础巩固---ThreadGroup API学习的更多相关文章
- java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程
上篇中在最后抛出一个问题,具体问题可以查看此篇[http://www.cnblogs.com/webor2006/p/7995229.html],这里不再概述,其实要实现这个需求可以用咱们之前学习的守 ...
- Java 线程基础
Java 线程基础
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- Java 线程基础知识
前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础巩固---线程生命周期以及start方法源码剖析
上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...
- java线程基础巩固---构造Thread对象你也许不知道的几件事
关于Thread的构造在JDK文档中如下: 之后会把上面所有的构造都会学习到,这次主要是去研究一下图上标红的默认构造,当然大家肯定对于它都有些不屑,这有啥可学的,不new一个然后start线程不就启动 ...
- java线程基础巩固---线程ID,优先级
这里学习Thread的两个比较简单的API,直接上代码: 线程ID: 那它的生成规则是?直接看源码: 那为什么目前打印是9呢?然后在jvm启动的时候就已经创建了8个线程?继续用jconsole来验证一 ...
随机推荐
- 深入浅出的分析 Set集合
01. 摘要 Set集合的特点主要有:元素不重复.存储无序的特点. 打开 Set 集合,主要实现类有 HashSet.LinkedHashSet .TreeSet .EnumSet( RegularE ...
- VSCode插件Prettier配置
参考链接:https://blog.csdn.net/wengou3033/article/details/88749448 Prettier格式化配置
- [转帖]Linux环境变量设置方法总结 PATH、LD_LIBRARY_PATH
Linux环境变量设置方法总结 PATH.LD_LIBRARY_PATH 2018年01月17日 21:10:26 晨至曦 阅读数 7548 https://blog.csdn.net/qq_1900 ...
- re(模块正则表达式)
re模块(正则) 正则是用一些具有特殊含义的符号组合到一起(成为正则表达式)来描述字符或者字符串的方法,或者说正则就是用来描述一类事物的规则. import re #从字符串中全部查找内容,返回一 ...
- zookeeper集群搭建与升级
zookeeper 1.zookeeper功能 1-1.配置管理 集中管理配置文件实现服务治理 1-2.命名服务 如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个 ...
- 【思维】ABC
题目描述 You are given a string s consisting of A, B and C.Snuke wants to perform the following operatio ...
- k8s-PV和PVC使用
上节课我们学习了 PV 的使用,但是在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在 Node 上而已,所以这节课我们就来给大家讲 ...
- android中sqlite数据库的基本使用和添加多张表
看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...
- 怎样理解xhr.overrideMimeType()和xhr.responseType
一般情况下, 我们会通过 xhr.responseType 告诉服务器我们想要什么类型的返回数据. 然后xhr.response 会根据xhr.responseType属性值来自动解析返回值. 但有时 ...
- uva 10325基础容斥
题目:给你一个数n以及m个数字,问1~n中不能被这m个数字整除的数字的个数. 分析:容斥原理.组合数学.数字1-n中能被a.b整除的数字的个数分别是n/a,n/b: 则1-n中能被a或b整数的数字个数 ...