1.创建继承Runnable接口的SearchTask类
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class SearchTask implements Runnable{
private Result result;
public SearchTask(Result result)
{
this.result=result;
}
@Override
public void run() {
// TODO Auto-generated method stub
String name=Thread.currentThread().getName();
System.out.printf("Thread %s:Start\n",name);
try
{
doTask();
result.setName(name);
}catch(InterruptedException e)
{
System.out.printf("Thread %s:Interrupted\n",name);
return;
}
System.out.printf("Thread %s:End\n",name);
}
//创建一个Random对象,生成一个随机数,并将它作为参数传给 sleep
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);
}
}
2.应用于存储执行完的线程的Result类
public class Result {
private String name;
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
}
3.主类的实现
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
// 创建一个线程组
ThreadGroup threadGroup = new ThreadGroup("Searcher");
Result result=new Result();
// 创建SearchTask实例对象 新建5个线程
SearchTask searchTask=new SearchTask(result);
for (int i=0; i<5; i++) {
Thread thread=new Thread(threadGroup, searchTask);
thread.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//打印线程数量和每个线程的具体信息
System.out.printf("Number of Threads: %d\n",threadGroup.activeCount());
System.out.printf("Information about the Thread Group\n");
threadGroup.list();
// 创建对象数量的线程,用于接收线程组中的线程
Thread[] threads=new Thread[threadGroup.activeCount()];
//将信息写入线程
threadGroup.enumerate(threads);
for (int i=0; i<threadGroup.activeCount(); i++) {
System.out.printf("Thread %s: %s\n",threads[i].getName(),threads[i].getState());
}
// 等待第一个线程运行完毕
waitFinish(threadGroup);
// 当线程组中的第一个线程运行结束之后,终止线程组的运行
threadGroup.interrupt();
}
//每隔1秒进行判断,线程组中是否有线程已经运行结束
private static void waitFinish(ThreadGroup threadGroup) {
while (threadGroup.activeCount()>4) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
4.运行结果
在这次的运行中,Thread-0的休眠时间最短,因此它可以打印出”Thread Thread-0: End”这句话,之后线程组中的其他线程都被中断,都打印出z中断提示信息。