文档章节

Java并发编程基础(四)

chendom
 chendom
发布于 01/20 11:21
字数 797
阅读 11
收藏 0

ThreadGroup

在主线程创建得线程,如果没有给他指定线程组,那么创建的线程,默认和主线程同一个线程组。线程组可以底下可以是线程,也可以实线程组。

构建线程组的方法:

  • private ThreadGroup()

  • public ThreadGroup(String name)

  • public ThreadGroup(ThreadGroup parent, String name)

  • private ThreadGroup(Void unused, ThreadGroup parent, String name)

     public class Demo {
     public static void main(String[] args) {
     	//获取当前线程所属的线程组
     	ThreadGroup g1 = Thread.currentThread().getThreadGroup();
     	//定义一个线程组
     	ThreadGroup g2 = new ThreadGroup("g2");
     	//判断当前线程所属的线程组的父线程
     	System.out.println(g2.getParent()==g1);//true
     	//定义新得线程,在之前得线程组之上
     	ThreadGroup g3 = new ThreadGroup(g2,"g3");
     	System.out.println(g3.getParent()==g2);//true
     }
     }
    

复制Thread数组和ThreadGroup数组

复制Thread数组

  1. public int enumerate(Thread[] list)

  2. public int enumerate(Thread[] list,boolean recurse)

上面的两个方法实际上是讲ThreadGroup中的active线程全部复制到Thread数组中,其中recurse参数是true,则该方法会将所有的子group的active线程都递归到Thread数组中,通过源码可以得知enumerate(Thread[],true)==enumerate(list),这两个方法都是调用的 private int enumerate(Thread list[], int n, boolean recurse)

	public int enumerate(Thread list[]) {
		checkAccess();
		return enumerate(list, 0, true);
	}
	public int enumerate(Thread list[], boolean recurse) {
		checkAccess();
		return enumerate(list, 0, recurse);
	}

 private int enumerate(Thread list[], int n, boolean recurse) {
		int ngroupsSnapshot = 0;
		ThreadGroup[] groupsSnapshot = null;
		synchronized (this) {
			if (destroyed) {
				return 0;
			}
			int nt = nthreads;
			if (nt > list.length - n) {
				nt = list.length - n;
			}
			for (int i = 0; i < nt; i++) {
				if (threads[i].isAlive()) {
					list[n++] = threads[i];
				}
			}
			if (recurse) {
				ngroupsSnapshot = ngroups;
				if (groups != null) {
					groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);
				} else {
					groupsSnapshot = null;
				}
			}
		}
		if (recurse) {
			for (int i = 0 ; i < ngroupsSnapshot ; i++) {
				n = groupsSnapshot[i].enumerate(list, n, true);
			}
		}
		return n;
	}

执行结果: 3 2

复制ThreadGroup

  1. public int enumerate(ThreadGroup list[])

  2. public int enumerate(ThreadGroup list[], boolean recurse)

     public class ThreadGroupEnumerateThreadGroupsDemo {
     	public static void main(String[] args) throws InterruptedException {
     		ThreadGroup g1 = new ThreadGroup("g1");
     		ThreadGroup g2 = new ThreadGroup(g1,"g2");
     		TimeUnit.MILLISECONDS.sleep(2);
     		ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
     		ThreadGroup[] list = new ThreadGroup[mainGroup.activeCount()];
     		int recurseSize = mainGroup.enumerate(list);
     		System.out.println(recurseSize);
     		recurseSize = mainGroup.enumerate(list,false);
     		System.out.println(recurseSize);
     	}
     }
    

执行结果: 2 1

ThreadGroup的基本操作

  • activeGcount()用于获取group中活跃的线程,这只是个估值。

  • activeGroupCount()用于获取group中活跃的子group,这也是一个近似估值,该方法也会递归获取所有的子group。

  • getMaxPriority()用于获取group的优先级,默认情况下,Group的优先级为10,在该group中,所有的线程的优先级不能大于group的优先级。

  • getName():或与group的名字。

  • getParent()获取group的父group,有就返回,没有就返回null。

  • list():该方法没有返回值,执行该方法会将group中所有的活跃的线程信息全部输出到控制台。

  • parentOf(ThreadGroup g):会判断当前的group的是不是给定group的父group,另外如果给定大group的是给自己本身,那么高返回true。

  • setMaxPriority(int pri)会指定group的最大优先级,最大优先级不能超过父group的最大优先级,该方法会把当前的线程组和子线程组的优先级都有影响。

© 著作权归作者所有

共有 人打赏支持
chendom
粉丝 1
博文 27
码字总数 58825
作品 0
深圳
私信 提问
Java 并发编程源码解析汇总篇

java并发编程,内存模型 java并发编程,volatile内存实现和原理 Java并发编程,并发基础 Java 并发编程,线程池(ThreadPoolExecutor)源码解析 Java并发编程,Executor 框架介绍 Java并发编...

郑加威
2018/12/23
0
0
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
Java 10大优点—Part4—Java内存模型

在忙着参加在爱沙尼亚进行的 TEDx talk 演讲活动以及在比利时举办的一届非常忙碌的Devoxx 会议的间隙,我将继续推进 Java’s Rocking 的系列博文。 对还没有接触过这个系列博文的读者,不妨先...

foxlee
2013/12/09
339
1
java 7 入门书籍

一、Java从入门到精通 《Java从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。 《Java从入门到精通(第3版...

modernizr
2014/05/15
6.9K
9

没有更多内容

加载失败,请刷新页面

加载更多

【kafka】kafka集群搭建

简介 要配置kafka,首先要配置zookeeper保证集群的高可用。因此本教程包含两者的配置。 1、下载kafka:https://www.apache.org/dyn/closer.cgi?path=/kafka/2.1.0/kafka_2.11-2.1.0.tgz 2、下...

Areya
13分钟前
1
0
iOS图片拉伸之神属性:resizableImageWithCapInsets

在仿写QQ会话窗口的时候,气泡的背景图片拉伸问题。并不是所有地方都可以拉伸的,所以定义了下面的工具类中的一个方法,专门拉伸图片。 UIImageResizingModeStrech:拉伸模式,通过拉伸UIEdg...

壹峰
19分钟前
0
0
Syncfusion教程:在Xamarin.Forms中创建数据输入表单 (2)

下载Essential Studio for Xamarin最新版本 Essential Studio for Xamarin是全面的Xamarin.iOS、Xamarin.Android和Xamarin.Forms组件套包,包含最快的图表和网格。 如何将Syncfusion输入控件...

电池盒
31分钟前
0
0
Infor宣布首次公开募股

为特定行业提供商业云软件的全球领先提供商Infor今天宣布达成协议,获得科氏控股发展有限公司(KED , Koch Equity Development, LLC)以及金门资本(Golden Gate Capital)15亿美元投资。 继201...

linux-tao
43分钟前
1
0
Mysql索引总结

由于Mysql的索引是B-tree或B+tree,所以下面会先涉及到一些树的概念。 1、二叉树特性:左子树的键值小于根的键值,右子树的键值大于根的键值。 2、平衡二叉树是为了减小树的深度从而减小查找...

浮躁的码农
44分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部