Java 线程组

线程组:可以有线程对象,也可以有线程组。(ThreadGroup)
线程组的作用是,可以批量的管理线程或线程组对象,有有效地对线程或线程组对象进行组织。
官方文档:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ThreadGroup.html
线程对象关联线程组:1级关联介绍:

1级关联就是父对象中有子对象,但并不创建子孙对象。

线程对象关联线程组:多级关联介绍:

多级关联就是父对象中有子对象,子对象中再创建子对象,也就是有子孙对象。如果关系太复杂反而不利于开发管理,所以多级关联不常见。

实例验证多级关联:
在这里插入图片描述
在这里插入图片描述
下面通过文档对线程组进行了解:

类结构:

在这里插入图片描述
文档对线程组的描述:

线程组表示一组线程。此外,线程组还可以包括其他线程组。线程组形成一个树,其中除初始线程组之外的每个线程组都有父节点。
允许线程访问有关其自己的线程组的信息,但不允许访问有关其线程组的父线程组或任何其他线程组的信息。

ThreadGroup提供了很多的方法,这里先不做阐述:下面列出很多方法,也有很多方法已经过时,此处不做描述,只列举常见的几个方法:
在这里插入图片描述
在这里插入图片描述
先来了解线程组的操作情况:

  • 1.线程组自动归属特性
  • 2.获取根线程组
  • 3.线程组里加线程组
  • 4.组内的线程批量停止
  • 5.递归与非递归取得组内对象

1.线程组自动归属特性

在这里插入图片描述
在这里插入图片描述

  • 在实例化一个ThreadGroup线程x时如果不指定所属的线程组,则x线程自动归到当前线程对象所属的数组组中,也就是隐式地在一个线程组中添加一个子线程组,所以在控制台中打印的线程组数量值由0变成了1。

2.获取根线程组

在这里插入图片描述
在这里插入图片描述
运行结果给出说明了。

3.线程组里加线程组

在这里插入图片描述
在这里插入图片描述
此时成功在一个线程组中添加了一个子线程组。

4.组内的线程批量停止

创建一个线程:
在这里插入图片描述
在这里插入图片描述
通过将线程归属到线程组中,当调用线程组ThreadGroup的interrupt()方法时,可以将该组中的所有正在运行的线程批量停止。

5.递归与非递归取得组内对象

public class Run {

	public static void main(String[] args) {
		ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
		ThreadGroup groupA = new ThreadGroup(mainGroup,"A");
		Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				try {
					System.out.println("runMethod");
					Thread.sleep(10000);//线程必须在运行状态才可以受组管理
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		ThreadGroup groupB = new ThreadGroup(groupA,"B");
		//分配空间,但不一定全部用完
		ThreadGroup[] listThreadGroups1  = new ThreadGroup[Thread.currentThread()
		              .getThreadGroup().activeGroupCount()];
		//传入true是递归取得子组及子孙组
		Thread.currentThread().getThreadGroup().enumerate(listThreadGroups1 , true);
		for (int i = 0; i < listThreadGroups1.length; i++) {
			if (listThreadGroups1[i] != null) {
				System.out.println(listThreadGroups1[i].getName());
			}
		}
		ThreadGroup[] listThreadGroups2 = new ThreadGroup[Thread.currentThread()
		               .getThreadGroup().activeGroupCount()];
		Thread.currentThread().getThreadGroup().enumerate(listThreadGroups2, false);
		for (int i = 0; i < listThreadGroups1.length; i++) {
			if (listThreadGroups2[i] != null) {
				System.out.println(listThreadGroups2[i].getName());
			}
		}
	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值