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来验证一 ...
随机推荐
- OPC 数据交互环境配置
本文源自ioufev先生的博客<OPC和DCOM配置>(https://www.cnblogs.com/ioufev/p/9365919.html)及「geekc」先生的<OPC工作 ...
- leetcode548 Split Array with Equal Sum
思路: 使用哈希表降低复杂度.具体来说: 枚举j: 枚举i,如果sum[i - 1] == sum[j - 1] - sum[i],就用哈希表把sum[i - 1]记录下来: 枚举k,如果sum[k ...
- CVPapers - Computer Vision Resource
To add links (PDF, project,...) you can use the online tool. Computer Vision Paper Indexes ICCV: 20 ...
- MySql中的count、NULL和空串的区别
**1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...
- orcale数据库授权码
Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca
- java类和对象详解
类和对象 java 是面向对象的语言 即 万物皆对象c语言是面向过程语言 一.怎么去描述一个对象? (1)..静态的(短时间内不会改变的东西) 例如:外观,颜色,品牌 (2).动态的(动作) 可以干什 ...
- Java静态代理与动态代理实现
一.什么是代理 代理是一种设计模式,它提供了一种通过代理访问目标对象的方式.在应用代理之前,我们调用对象的过程如下: 客户端直接调用对象并获取返回值.而应用了代理之后,我们调用对象的过程变成如下: 客 ...
- python并发编程之多进程(实践篇)
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了multiproce ...
- 轻松搭建CAS 5.x系列(2)-搭建HTTPS的SSO SERVER端
概要说明 CAS要求,必须使用HTTPS的服务,否则就只等实现登录,无法实现单点登录.科普下HTTPS,网站有HTTP和HTTPS两种协议.HTTP是浏览器到网站之间是明文传输,比如你输入帐号名和密码 ...
- Scala学习二十二——定界延续
一.本章要点 延续让你可以回到程序执行当中之前的某个点; 可以在shift块中捕获延续 延续函数一直延展到包含它的reset块的尾部 延续所谓的”余下的运算“,从包含shift的表达式开始,到包含它的 ...