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();
}
}
}
}
执行结果