ThreadGroup初识:

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

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

接下来定义一个ThreadGroup:

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

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

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

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

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

那接下来论证一下吧:

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

编译运行:

所以上面官网的两条说明从实验当中貌似都不成立。

ThreadGroup常用API介绍:

activeCount():

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

编译运行:

activeGroupCount():

编译运行:

checkAccess():

试试下:

destroy():

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

enumerate(Thread[] list):

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

enumerate(Thread[] list, boolean recurse):

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

interrupt():

那下面来瞅一下:

  1. public class ThreadGroupApi {
  2. public static void main(String[] args) {
  3. ThreadGroup threadGroup = new ThreadGroup("TG1");
  4. Thread t1 = new Thread(threadGroup, "T1") {
  5. @Override
  6. public void run() {
  7. while (true) {
  8. try {
  9. Thread.sleep(10_000);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }
  15. };
  16. t1.start();
  17.  
  18. ThreadGroup threadGroup2 = new ThreadGroup(threadGroup, "TG2");
  19. Thread t2 = new Thread(threadGroup2, "T2") {
  20. @Override
  21. public void run() {
  22. while (true) {
  23. try {
  24. Thread.sleep(1_000);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. };
  31. t2.start();
  32.  
  33. // System.out.println(threadGroup.activeCount());
  34. // System.out.println(threadGroup.activeGroupCount());
  35. // threadGroup2.checkAccess();
  36. //// threadGroup.destroy();
  37. //
  38. // System.out.println("====================");
  39. // Thread[] threads = new Thread[threadGroup.activeCount()];
  40. // threadGroup.enumerate(threads);
  41. // Arrays.asList(threads).forEach(System.out::println);
  42. //
  43. // System.out.println("====================");
  44. // threads = new Thread[10];
  45. // Thread.currentThread().getThreadGroup().enumerate(threads, false);
  46. // Arrays.asList(threads).forEach(System.out::println);
  47.  
  48. threadGroup.interrupt();
  49. }
  50. }

其中TG1线程组包含一个子TG2线程组,也就是有两个线程,那结果这两个线程会被打断么,运行一下呗:

果真如此~

setDaemon(boolean daemon):

那下面来实验一下:

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

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

java线程基础巩固---ThreadGroup API学习的更多相关文章

  1. java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程

    上篇中在最后抛出一个问题,具体问题可以查看此篇[http://www.cnblogs.com/webor2006/p/7995229.html],这里不再概述,其实要实现这个需求可以用咱们之前学习的守 ...

  2. Java 线程基础

    Java 线程基础

  3. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  4. Java 线程基础知识

    前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...

  5. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  6. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  7. java线程基础巩固---线程生命周期以及start方法源码剖析

    上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...

  8. java线程基础巩固---构造Thread对象你也许不知道的几件事

    关于Thread的构造在JDK文档中如下: 之后会把上面所有的构造都会学习到,这次主要是去研究一下图上标红的默认构造,当然大家肯定对于它都有些不屑,这有啥可学的,不new一个然后start线程不就启动 ...

  9. java线程基础巩固---线程ID,优先级

    这里学习Thread的两个比较简单的API,直接上代码: 线程ID: 那它的生成规则是?直接看源码: 那为什么目前打印是9呢?然后在jvm启动的时候就已经创建了8个线程?继续用jconsole来验证一 ...

随机推荐

  1. 【AMAD】django-crispy-forms -- 不要再重复编写Django Form了!

    动机 简介 个人评分 动机 这个APP提供了一个template tag和一个template filter,让你可以在模版中快速渲染表单. 简介 django-crispy-forms1可以看作是d ...

  2. Debezium系列随笔

    0.Debezium简介 1.Run Debezium for Mysql in docker step by step 2.Run Debezium for SQLServer in docker ...

  3. Python获取 东方财富 7x24小时全球快讯

    本文使用的IDE为PyCharm. 1.第三方库 (1)selenium selenium用来做浏览器自动化,因为这部分信息是动态加载的,不用这种方法读取不到相关数据. 安装: pip3 instal ...

  4. Python报错总结丶自定义报错

    Python报错总结: 常见异常 1,NameError: name 'a' is not defined:未定义函数名             2,IndentationError: uninden ...

  5. [转] zookeeper 本地启动多节点

    1. zoo.cfg配置文件如下: # The number of milliseconds of each tick tickTime=2000 # The number of ticks that ...

  6. Solr 8.2 使用指南

    1 Solr简介 1.1 Solr是什么 Solr是一个基于全文检索的企业级应用服务器.可以输入一段文字,通过分词检索数据.它是单独的服务,部署在 tomcat. 1.2 为什么需要Solr 问题:我 ...

  7. ubuntu中配置ip地址和上网配置

    ubuntu中的ip地址配置: 基于NAT模式: 如果能正常连接ip,但不能ping动www.baidu.com的话,我们需要在配置文件中配置主机上网的DNS地址,如下: 如果上面图片上的DNS se ...

  8. 剑指offer21:第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。(注意:这两个序列的长度是相等的)

    1 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...

  9. DAG添边定理

    让DAG变成强连通就是把尾和头连起来,也就是入度和出度为0的点,添的边数:max(num_in==0,num_out==0)

  10. opencv实现人脸识别(四) 人脸识别模块

    到这一步就是进行人脸识别了. 流程图: 代码: import cv2 def recognize(cam): recognizer = cv2.face.LBPHFaceRecognizer_crea ...