锁系列:共享锁CountDownLatch,实现主线程等待子线程任务完成后,再继续执行。

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁系列:共享锁CountDownLatch,实现主线程等待子线程任务完成后,再继续执行。相关的知识,希望对你有一定的参考价值。

上效果图:

大致步骤就是:
在主线程中新建CountDownLatch对象latch,调用latch.await(), 并将对象传入子线程,子线内部任务完成时调用latch.countDown()

  • 代码如下:

public class CountDownLatchTest {

    public static void main(String[] args) {
        try {
            System.out.println(getCurrentTimeStr() + Thread.currentThread().getName() + "等待子线程从仓库取货");

            CountDownLatch latch = new CountDownLatch(1);
            GetGoodsThread thread = new GetGoodsThread(latch);
            thread.start();
            latch.await();
            System.out.println(getCurrentTimeStr() + Thread.currentThread().getName() + "开始送货");

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

    private static final SimpleDateFormat sdf = new SimpleDateFormat("MM-dd hh:mm:ss");

    public static String getCurrentTimeStr() {
        return sdf.format(new Date()) + ": ";
    }

    static class GetGoodsThread extends Thread {
        CountDownLatch latch;

        public GetGoodsThread(CountDownLatch latch) {
            this.latch = latch;
        }

        @Override
        public void run() {
            try {
                System.out.println(getCurrentTimeStr() + Thread.currentThread().getName() + "去仓库");
                Thread.sleep(1000);

                System.out.println(getCurrentTimeStr() + Thread.currentThread().getName() + "找货");
                Thread.sleep(1000);

                System.out.println(getCurrentTimeStr() + Thread.currentThread().getName() + "回来");
                Thread.sleep(1000);

                latch.countDown();
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
    }

}

以上是关于锁系列:共享锁CountDownLatch,实现主线程等待子线程任务完成后,再继续执行。的主要内容,如果未能解决你的问题,请参考以下文章

AQS共享锁和独占锁

Java并发包中线程并发器

互斥锁 & 共享锁

并发编程技术六之共享锁CountDownLatch源码分析

互斥锁 & 共享锁

CountDownLatch源码分析