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来验证一 ...
随机推荐
- 有关IP和子网掩码的总结
从之前写的那个概括的文章之后,具体细节知识我也不知道写啥子,最近忙于毕业论文和考证,所以就总结一下这方面的知识,本篇的话就先从IP说起. IP这方面有IPv4和IPv6这两方面的内容,这里就只说IPv ...
- 【ARM-Linux开发】cmem模块/DVSDK2.0
1. CMEM--高速缓存一致性问题的解决多核设计中,共享的二级高速缓存之间数据可能不一致,不同CPU内核的私有高速缓存也可能存在数据不一致,称为高速缓存的一致性问题.解决一致性问题的方法从整体上分可 ...
- hdoj1561 The more, The Better (树形dp,分组背包)
题目链接:https://vjudge.net/problem/HDU-1561 题意:给一个森林,每个结点有个权值,求选m个结点的最大权值和,并且选子结点前必须先选父结点. 思路: 把每颗树的树根连 ...
- Flutter、Weex、RN,Native对比
- loadrunner如何监控linux,以及重点指标分析
监控UNIX一. lr监控UNIX ,UNIX先启动一rstatd服务 以下是在IBM AIX系统中启动rstatd服务的方法: 1. 使用telnet以root用户的身份登录入AIX系统 2. 在命 ...
- jupyter的控件交互
jupyter实现控件交互 jupyter notebook 是一个交互式IDE 直接上jupyter notebook界面截图
- 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 ax^2+bx+c=0ax 2 +bx+c=0 的两个解。
#!/usr/bin/python # 导入math包 import math def quadratic(a, b, c): if not isinstance(a, (int, float))an ...
- k8s之RBAC-基于角色的访问控制
一个在名称空间内的对象的完整url模板: Object_URL: /apis/<GROUP>/<VERSION>/namespaces/<NAMESPACE_NAME&g ...
- 数据库优化方案之SQL脚本优化
随着数据库数据越来越大,数据单表存在的数据量也就随之上去了,那么怎么样让我们的脚本查询数据更快呢? 在这个地方我们主要提到两个数据库类型: 1.MSSQL(该数据库我们通过执行计划来查看数据库性能在哪 ...
- SpringBoot下实现MongoDB字段类型转换器
1 目的 MongoDB Java String LocalDateTime 2 实现 先定义实体类 @Data // lombok @Accessors(chain = true) @Documen ...