Java 多线程系列(4) —— 线程组

2020-12-09 11:00:42 浏览数 (1)

线程组

线程组多用于对相同功能的线程进行管理,线程组既可以包含子线程,也可以包含子线程组。 线程组的最高一级是 system 线程组,即系统线程组,也是根线程组。 一般线程组呈树状结构。 因此线程组可以视为

创建线程时的默认线程组

一般创建咸成师并没有被设置线程组入参,那么创建线程时线程会被分配到那个线程组中去呢

线程创建源码

由源码可知,线程创建时首先判断系统是否有 securitymanager,如果有则新创建的线程会被放到和 SecurityManager 相同的线程组下,否则会和父线程在同一个线程组。

PS: Main 线程的父线程组为 System 线程组,但是System 线程组没有父线程组

如何将线程假如到线程组

那么我们该如何将线程加入到我们指定的线程组中呢 【示例】

代码语言:javascript复制
ThreadGroup group = new ThreadGroup("Thread-Group-1");
Thread thread1 = new Thread(group,runnable,"Thread-1");
thread1.start()

当创建一个新的线程组时

新的线程组的默认父线程组为创建该线程组的线程所在的线程组。

线程组参数

线程组的参数:

  • name: 线程组的名称
  • maxPriority:线程组所允许的最大线程等级
  • destroyed:表示该线程组是否被销毁

线程组的常用方法

线程组的常用方法:

  • getName():获取线程组名称
  • setMaxPriority(int pri):设置线程组的最大优先级
  • getMaxPriority():获取线程组中最大的优先级
  • isDestroyed():获取线程组是否被销毁
  • enumerate(Thread list[]):将当前线程组中每一个线程以及其子线程组都复制到指定线程数组中
  • activeCount():返回当前线程组中活动的线程数目
  • interrupt():批量停止线程组中正在运行的所有线程

获取线程组与根线程组

代码语言:javascript复制
//获取当前线程所在的线程组名称
Thread.currentThread().getThreadGroup().getName();
//获取当前线程组的父线程组
Thread.currentThread().getThreadGroup().getParent().getName();

线程组处理批量异常

当然,使用线程组也可以方便统一处理线程组中抛出的异常

Step1: 创建一个类并重写 uncaughtException 方法

代码语言:javascript复制
public class MyThreadGroup extends ThreadGroup {

	public MyThreadGroup(String name) {
		super(name);
	}
	
	@Override
	public void uncaughtException(Thread t,Throwable e) {
		System.out.printf("The thread %s has thrown an Exceptionn", t.getId());
		e.printStackTrace(System.out);
		System.out.printf("Terminating the rest of the Threads");
		interrupt();
	}

}

Step2: 创建一个线程任务,用该任务模拟抛出异常

代码语言:javascript复制
public class Task implements Runnable {

	@Override
	public void run() {
		int result;
		Random random = new Random(Thread.currentThread().getId());
		while(true) {
			result = 1000/ ((int)(random.nextDouble()*100000000));
			if(Thread.currentThread().isInterrupted()) {
				System.out.printf("%d : Interruptedn", Thread.currentThread().getId());
			}
		}

	}

}

Step3: Main 方法,创建多个线程并加入到线程组中,看线程组如何处理线程抛出的异常

代码语言:javascript复制
	public static void main(String[] args) {
		int numberOfThreads = 2*Runtime.getRuntime().availableProcessors();
		MyThreadGroup threadGroup = new MyThreadGroup("MyThreadGroup");
		Task task = new Task();
		for(int i=0; i<numberOfThreads; i  ) {
			Thread t = new Thread(threadGroup,task);
			t.start();
		}
		System.out.printf("Number of Threads: %dn", threadGroup.activeCount());
		System.out.printf("Information about the Thread Groupn");
		threadGroup.list();
		Thread[] threads = new Thread[threadGroup.activeCount()];
		threadGroup.enumerate(threads);
		for(int i=0; i<threadGroup.activeCount(); i  ) {
			System.out.printf("Thread %s: %sn", threads[i].getName(),threads[i].getState());
		}
	}

0 人点赞