1.10线程的分组

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中断提示信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值