From Coffee to Data

技术需要善加利用:让弱小者的声音得到倾听,让每个人都有参与的机会,让世界免于灾难之苦。 ——Martin Kleppmann

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

ThreadGroup是Java提供的一种对线程进行分组管理的手段,可以对所有线程以组为单位进行操作,如设置优先级、守护线程等。

线程组也有父子的概念,如下图:

线程组的创建

 1 public class ThreadGroupCreator {
 2 
 3     public static void main(String[] args) {
 4         //获取当前线程的group
 5         ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
 6         //在当前线程执行流中新建一个Group1
 7         ThreadGroup group1 = new ThreadGroup("Group1");
 8         //Group1的父线程,就是main线程所在Group
 9         System.out.println(group1.getParent() == currentGroup);
10         //定义Group2, 指定group1为其父线程
11         ThreadGroup group2 = new ThreadGroup(group1, "Group2");
12         System.out.println(group2.getParent() == group1);
13     }
14 }

线程组的基本操作

注意:后添加进线程组的线程,其优先级不能大于线程组的优先级

 1 public class ThreadGroupBasic {
 2 
 3     public static void main(String[] args) throws InterruptedException {
 4         
 5         ThreadGroup group = new ThreadGroup("group1");
 6         Thread thread = new Thread(group, () -> {
 7             while(true) {
 8                 try {
 9                     TimeUnit.SECONDS.sleep(1);
10                 } catch (InterruptedException e) {
11                     e.printStackTrace();
12                 }
13             }
14         }, "thread");
15         thread.setDaemon(true);
16         thread.start();
17         
18         TimeUnit.MILLISECONDS.sleep(1);
19         
20         ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
21         //递归获取mainGroup中活跃线程的估计值
22         System.out.println("activeCount = " + mainGroup.activeCount());
23         //递归获mainGroup中的活跃子group
24         System.out.println("activeGroupCount = " + mainGroup.activeGroupCount());
25         //获取group的优先级, 默认为10
26         System.out.println("getMaxPriority = " + mainGroup.getMaxPriority());
27         //获取group的名字
28         System.out.println("getName = " + mainGroup.getName());
29         //获取group的父group, 如不存在则返回null
30         System.out.println("getParent = " + mainGroup.getParent());
31         //活跃线程信息全部输出到控制台
32         mainGroup.list();
33         System.out.println("----------------------------");
34         //判断当前group是不是给定group的父线程, 如果两者一样,也会返回true
35         System.out.println("parentOf = " + mainGroup.parentOf(group));
36         System.out.println("parentOf = " + mainGroup.parentOf(mainGroup));
37 
38     }
39 
40 }

线程组的Interrupt

 1 ublic class ThreadGroupInterrupt {
 2 
 3     public static void main(String[] args) throws InterruptedException {
 4         ThreadGroup group = new ThreadGroup("TestGroup");
 5         new Thread(group, () -> {
 6             while(true) {
 7                 try {
 8                     TimeUnit.MILLISECONDS.sleep(2);
 9                 } catch (InterruptedException e) {
10                     //received interrupt signal and clear quickly
11                     System.out.println(Thread.currentThread().isInterrupted());
12                     break;
13                 }
14             }
15             System.out.println("t1 will exit");
16         }, "t1").start();
17         new Thread(group, () -> {
18             while(true) {
19                 try {
20                     TimeUnit.MILLISECONDS.sleep(2);
21                 } catch (InterruptedException e) {
22                     //received interrupt signal and clear quickly
23                     System.out.println(Thread.currentThread().isInterrupted());
24                     break;
25                 }
26             }
27             System.out.println("t2 will exit");
28         }, "t2").start();
29         //make sure all threads start
30         TimeUnit.MILLISECONDS.sleep(2);
31         
32         group.interrupt();
33     }
34 
35 }

线程组的destroy

 1 public class ThreadGroupDestroy {
 2 
 3     public static void main(String[] args) {
 4         ThreadGroup group = new ThreadGroup("TestGroup");
 5         ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
 6         //before destroy
 7         System.out.println("group.isDestroyed=" + group.isDestroyed());
 8         mainGroup.list();
 9         
10         group.destroy();
11         //after destroy
12         System.out.println("group.isDestroyed=" + group.isDestroyed());
13         mainGroup.list();
14     }
15 
16 }

线程组设置守护线程组

线程组设置为守护线程组,并不会影响其线程是否为守护线程,仅仅表示当它内部没有active的线程的时候,会自动destroy

 

 1 public class ThreadGroupDaemon {
 2 
 3     public static void main(String[] args) throws InterruptedException {
 4         ThreadGroup group1 = new ThreadGroup("group1");
 5         new Thread(group1, () -> {
 6             try {
 7                 TimeUnit.SECONDS.sleep(1);
 8             } catch (InterruptedException e) {
 9                 e.printStackTrace();
10             }
11         }, "group1-thread1").start();
12         ThreadGroup group2 = new ThreadGroup("group2");
13         new Thread(group2, () -> {
14             try {
15                 TimeUnit.SECONDS.sleep(1);
16             } catch (InterruptedException e) {
17                 e.printStackTrace();
18             }
19         }, "group1-thread2").start();
20         group2.setDaemon(true);
21         
22         TimeUnit.SECONDS.sleep(3);
23         System.out.println(group1.isDestroyed());
24         System.out.println(group2.isDestroyed());
25     }
26 }

 

posted on 2018-11-08 13:41  Leoliu168  阅读(2832)  评论(0编辑  收藏  举报