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来验证一 ...
随机推荐
- OpenGL学习(4)——纹理(补)
完成章节后练习 练习 1. Make sure only the happy face looks in the other/reverse direction by changing the fra ...
- 学习SpringBoot整合SSM三大框架源码之SpringBoot
Spring Boot源码剖析 一.Spring Boot 项目的启动入口流程分析 Spring Boot项目的启动入口main线程上有一个@SpringBootApplication( @Confi ...
- 洛谷 题解 P2010 【回文日期】
因为有8个字符,所以可得出每一年只有一个回文日期. 因此只要判断每一年就行了. 做法: 我们先把年倒过来,例如2018年就倒为8102,就得出8102就是回文日期的后四个字符,我们只要判断一下有没有这 ...
- 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理
目录 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理 17.1 计划任务-at-cron-计划任务使用方法 17.1.1 at计划任务的使用 17.1.2 查看和删除at将要执行 ...
- #【Python】【基础知识】【内置对象常用方法】
数字 数字的常用方法: >>> dir(int) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class ...
- [转帖]龙芯:Docker 配置与实践清单
Docker 配置与实践清单 http://www.sohu.com/a/254904706_198222 文章对来官方文档及 Docker Links[1] 中链接内容进行归档整理,包含了日常工作中 ...
- error LNK2001: unresolved external symbol __imp__closesocket@4
环境:Visual C++6.0 问题:链接错误 描述: Linking... NetSrv.obj : error LNK2001: unresolvedexternal symbol __imp_ ...
- 【第一季】CH06_FPGA设计Verilog基础(三)
[第一季]CH06_FPGA设计Verilog基础(三) 一个完整的设计,除了好的功能描述代码,对于程序的仿真验证是必不可少的.学会如何去验证自己所写的程序,即如何调试自己的程序是一件非常重要的事情. ...
- 【leetcode】74. 搜索二维矩阵
题目链接:传送门 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 ...
- php--最新正则(手机号码)
这次给大家带来正则验证(2018最新最全手机号验证),正则验证(2018最新最全手机号验证)的注意事项有哪些,下面就是实战案例,一起来看一下. 下面给大家分享2018手机号正则表达式验证方法,具体内容 ...