欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java多线程 ThreadGroup线程组

程序员文章站 2022-05-05 16:34:08
...

线程组ThreadGroup

——线程的集合

——树状结构 大线程组可以包含小线程组

——可以通过enumerate方法遍历组内的线程,执行操作

——可管理组内线程,但效率低下,粒度不够精细

——任务分配与执行过程耦合

——线程重复创建关闭,开销较大

 

案例演示

 

Searcher类实现Runnable接口  重写run()方法   Result是一个简单的bean类

该线程执行一个简单的启动 完成过程  中途可能被打断
 

public class Searcher implements Runnable{
	
	
	private Result result;
	public Searcher(Result result)
	{
		this.result=result;
	}
	@Override
	public void run()
	{
		String name=Thread.currentThread().getName();
		System.out.printf("Thread %s 启动\n",name);
		try
		{
			doTask();
			result.setName(name);
		}catch(InterruptedException e)
		{
			System.out.printf("Thread %s 被中断\n", name);
			return;
		}
		System.out.printf("Thread %s 完成\n", name);
	}
	
	private void doTask() throws InterruptedException
	{
		Random random=new Random((new Date()).getTime());
		int value=(int)(random.nextDouble()*100);
		System.out.printf("Thread %s  %d \n", Thread.currentThread().getName(),value);
		TimeUnit.SECONDS.sleep(value);
	}

}

Main过程

创建一个ThreadGroup线程组

创建Searcher对象

同时依次创建10个线程(含threadgroup构造,即线程创建后交由ThreadGroup线程组管理)

threadGroup.list()方法打印线程组信息

threadGroup.enumerate()方法获取详细各线程信息

一旦其中一个线程完成 threadGroup.interrupt()打断其它线程

 

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个线程组
		ThreadGroup threadGroup=new  ThreadGroup("Searcher");
		
		Result result=new Result();
		//Searcher是实现了runnable接口的线程类
		Searcher searchTask=new Searcher(result);
		for(int i=0;i<10;i++)
		{
			Thread thread=new Thread(threadGroup,searchTask);
			thread.start(); //启动每一个创建的线程
			try
			{
				TimeUnit.SECONDS.sleep(1);
			}catch(InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		System.out.println("===================");
		System.out.println("线程组信息");
		threadGroup.list();//打印线程组信息
		System.out.println("===================");
		//遍历线程组
		Thread[] threads=new Thread[threadGroup.activeCount()];
		threadGroup.enumerate(threads);//读出当前存活的线程
		for(int i=0;i<threads.length;i++)
		{
			System.out.printf("Thread %s %s \n",threads[i].getName(),threads[i].getState() );
			
		}
		waitFinish(threadGroup);
		threadGroup.interrupt();
	}
	public static void waitFinish(ThreadGroup threadGroup)
	{
		while(threadGroup.activeCount()>9)
		{
			try
			{
				TimeUnit.SECONDS.sleep(1);
			}catch(InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}

}

 执行结果

 

Java多线程 ThreadGroup线程组