如何确保多线程已经全部执行完成

  利用CountDownLatch闭锁实现。

  CountDownLatch可以使一个或多个线程等待一组事件的发生,闭锁状态包含一个计数器,该计数器被初始化为一个正数,表示需要等待事件的数量。

  发挥主要作用的两个方法分别是:

    countDown(); 递减计数器,表示一个事件已经发生了;

    await(); 等待计数器达到零,如果计数器的值非零,那么await会一直阻塞直到计数器为零,或等待中的线程中断,或等待超时。

  

public class TimeTest{

    public void cyclic() {
        for(int i=0;i < 100;i++) {
            System.out.println(Thread.currentThread().getId() + "---" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        int nThread = 100;
        final CountDownLatch endGate = new CountDownLatch(nThread);

        TimeTest timeTest = new TimeTest();
        for(int i=0;i<nThread;i++){
            Thread t = new Thread(() -> {
                try {
                    timeTest.cyclic();
                }finally {
                    endGate.countDown();
                }
            });
            t.start();
        }
        endGate.await();
        System.out.println("线程执行完成");
    }
}

  另外,我们还可以利用CountDownLatch来计算多线程执行一个任务需要的时间。

public class TimeTest{

    //待测试方法
    public void cyclic() {
        for(int i=0;i < 100;i++) {
            System.out.println(Thread.currentThread().getId() + "---" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        int nThread = 100;
        final CountDownLatch startGate = new CountDownLatch(1);
        final CountDownLatch endGate = new CountDownLatch(nThread);

        TimeTest timeTest = new TimeTest();
        for(int i = 0;i < nThread;i++){
            Thread t = new Thread(() -> {
                try {
                    startGate.await();
                    try {
                        timeTest.cyclic();
                    }finally{
                        endGate.countDown();
                    }
                } catch (InterruptedException ignored) {
                }
            });
            t.start();
        }

        long start = System.nanoTime();
        startGate.countDown();
        endGate.await();
        long end = System.nanoTime();
        System.out.println("耗时:" + (end-start));
}

 

posted @ 2019-02-01 15:13  meama  阅读(2330)  评论(0编辑  收藏  举报