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):
那下面来实验一下:
确实是守护线程组会随着它里面的最后线程执行完而消亡,那如果不设置成守护呢?
这时线程组就没有被销毁了,此时需要手动的去销毁它,如下: