Java并发编程之:ThreadGroup

线程组ThreadGroup标识一组线程的集合,一旦一个线程归属到一个线程组中,就不能更换其所在的线程组。

使用线程组好处:方便统一管理,线程组合一进行复制,快读定位到一个线程,统一进行一场设置等。

ThreadGroup并不属于java并发包中的内容,它是java.lang中的内容。

基本方法:

1.获取当前线程组名:

Thread.currentThread().getThreadGroup().getName();

在main方法中输出main

2.将线程放入到一个线程组中去

1ThreadGroup tg = new ThreadGroup("My Group"); 2MyThread2 thrd = new MyThread2(tg, "MyThread #1"); 3MyThread2 thrd2 = new MyThread2(tg, "MyThread #2"); 4MyThread2 thrd3 = new MyThread2(tg, "MyThread #3");

其中Thread中和ThreadGroup相关的构造函数:

1public Thread(ThreadGroup group, Runnable target) { 2 init(group, target, "Thread-" + nextThreadNum(), 0); 3} 4 5 6public Thread(ThreadGroup group, String name) { 7 init(group, null, name, 0); 8} 9 10 11public Thread(ThreadGroup group, Runnable target, String name) { 12 init(group, target, name, 0); 13} 14 15public Thread(ThreadGroup group, Runnable target, String name, long stackSize) { 16 init(group, target, name, stackSize); 17}

它们最终都是调用同一个函数:

1 private void init(ThreadGroup g, Runnable target, String name, 2 long stackSize) { 3Thread parent = currentThread(); 4SecurityManager security = System.getSecurityManager(); 5if (g == null) { 6 //安全检查 7 if (security != null) { 8 g = security.getThreadGroup(); 9 } 10 11 //设置线程组 12 if (g == null) { 13 g = parent.getThreadGroup(); 14 } 15} 16 17 //检查可达性 18g.checkAccess(); 19 20 //是否有权限访问 21if (security != null) { 22 if (isCCLOverridden(getClass())) { 23 security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); 24 } 25} 26 27 //往线程组添加线程但未启动 28 g.addUnstarted(); 29 30this.group = g; 31this.daemon = parent.isDaemon();//是否守护线程 32this.priority = parent.getPriority();//优先级 33this.name = name.toCharArray(); 34if (security == null || isCCLOverridden(parent.getClass())) 35 this.contextClassLoader = parent.getContextClassLoader(); 36else 37 this.contextClassLoader = parent.contextClassLoader; 38this.inheritedAccessControlContext = AccessController.getContext(); 39this.target = target; 40setPriority(priority); 41 if (parent.inheritableThreadLocals != null) 42 this.inheritableThreadLocals = 43 ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); 44 this.stackSize = stackSize; 45 tid = nextThreadID(); 46 this.me = this; 47 }

3、复制线程组:

1Thread thrds[] = new Thread[tg.activeCount()]; 2tg.enumerate(thrds);

这里的activeCount很明显就是取得活动的线程,注意。默认情况 下,连同其子线程组也会进行复制。

4、未捕获异常处理

ThreadGroup中有一个uncaughtException()方法。当线程组中某个线程发生Unchecked exception异常时,由执行环境调用此方法进行相关处理,如果有必要,可以重新定义此方法

统一异常处理:

1public class ThreadGroupExec { 2 3 public static void main(String[] args) { 4 ThreadGroup threadGroup1 = new ThreadGroup("group1"){ 5 @Override 6 public void uncaughtException(Thread t, Throwable e) { 7 System.out.println(t.getName() + ": " + e.getMessage()); 8 } 9 }; 10 11 // 这是匿名类写法 12 Thread thread1 = 13 // 这个线程是threadGroup1的一员 14 new Thread(threadGroup1, new Runnable() { 15 @Override 16 public void run() { 17 // 抛出unchecked异常 18 throw new RuntimeException("测试异常"); 19 } 20 }); 21 22 thread1.start(); 23 } 24}

查看构造函数:

1public class ThreadGroup implements Thread.UncaughtExceptionHandler { 2 private final ThreadGroup parent;//父亲ThreadGroup 3 String name;//ThreadGroupr 的名称 4 int maxPriority;//线程最大优先级 5 boolean destroyed;//是否被销毁 6 boolean daemon;//是否守护线程 7 boolean vmAllowSuspension;//是否可以中断 8 9 int nUnstartedThreads = 0;//还未启动的线程 10 int nthreads;//ThreadGroup中线程数目 11 Thread threads[];//ThreadGroup中的线程 12 13 int ngroups;//线程组数目 14 ThreadGroup groups[];//线程组数组

参考:

https://blog.csdn.net/evankaka/article/details/51627380

http://blog.csdn.net/edward\_qing\_lee/article/details/8767612

https://www.cnblogs.com/yiwangzhibujian/p/6212104.html

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java ThreadGroup 作用 方法解析(转)

ThreadGroup线程组,java对这个类的描述呢就是“线程组表示一组线程。此外,线程组还可以包括其他线程组。线程组形成一个树,其中除了初始线程组之外的每个线程组都有一个父线程组。允许线程访问关于其线程组的信息,但不允许访问关于其线程组的父线程组或任何其他线程组的信息。”ThreadGroup并不是算是标注容器,因为,最后你会发现这个家伙

Executor框架

任务是一组逻辑工作单元,而线程则是使任务异步执行的机制。线程池简化了线程的管理工作,并且java.util.concurrent提供了一种灵活的线程池实现作为Executor框架的一部分。在Java类库中,任务执行的主要抽象不是Thread,而是Executor,如下所示:publicinterfaceExecutor{void

Java CyclicBarrier介绍

CyclicBarrier(周期障碍)类可以帮助同步,它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier是使用整型变量构造的,其确定组中的线程数。当一个线程到达屏障时(通过调用CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。与CountDownLatch不同的

Java 线程池原理分析

1.简介线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销。在应用上,线程池可应用在后端相关服务中。比如Web服务器,数据库服务器等。以Web服务器为例,假如Web服务器会收到大量短时的HTTP请求,如果此时我们简单的为每个HTTP请求创建一个处理线程,那么服务器

JUC

Java5.0在java.util.concurrent包中提供了多种并发容器类来改进同步容器的性能。CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一