Java:主线程和子线程-----主线程等待子线程结束

来源:互联网 发布:淘宝埋地雷什么意思 编辑:程序博客网 时间:2024/05/16 07:24

想做的一个程序如题,主要是想统计子线程都执行完毕所用的时间,网上搜索到了CountDownLatch这个类,这个工具类可以理解为计数器。在这里用于表示正在运行的线程数,当一个子线程结束的时候,将这个计数器减一,最后在主线程的一个地方等待子线程全部执行完毕,再继续运行等待后面的程序。写了个Demo程序,如下:

 

//子线程

public class SubThread extends Thread{

 

    //子线程记数器,记载着运行的线程数

    private CountDownLatchrunningThreadNum;

 

    publicSubThread(CountDownLatch runningThreadNum){

        this.runningThreadNum= runningThreadNum;

    }

     

    @Override

    public void run() {

        System.out.println(Thread.currentThread().getName()+"-start");

        System.out.println(Thread.currentThread().getName()+"-dosomething");

        System.out.println(Thread.currentThread().getName()+"-end");

        runningThreadNum.countDown();//正在运行的线程数减一

    }

}

 

//Main主线程

public class MainThread {

  public static void main(String[] args)throws InterruptedException {

        longstartTime = System.currentTimeMillis();

        intthreadNum = 5; //线程数

        //定义正在运行的线程数

        CountDownLatchrunningThreadNum = new CountDownLatch(threadNum);

        System.out.println(Thread.currentThread().getName()+"-start");

        //创建多个子线程

        for(int i = 0; i < threadNum; i++) {

            newSubThread(runningThreadNum).start();

        }

        //等待子线程都执行完了再执行主线程剩下的动作

        runningThreadNum.await();

        System.out.println(Thread.currentThread().getName()+"-end");

        longendTime = System.currentTimeMillis();

        System.out.println("runningTime:"+(endTime-startTime));

    }

}