CountDownLatch和CyclicBarrier

2021-05-07  本文已影响0人  lconcise

CountDownLatch

主要用来解决一个线程等待多个线程的场景。

image.png

Demo

    public static void main(String[] args) throws InterruptedException {
        // 创建线程池,来执行任务
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2, 5,
                5, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                Thread::new,
                new ThreadPoolExecutor.AbortPolicy());

        CountDownLatch countDownLatch = new CountDownLatch(2);

        // 任务一
        executor.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("执行A计划");

            countDownLatch.countDown();
        });

        // 任务二
        executor.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("执行B计划");

            countDownLatch.countDown();
        });

        // 等待
        countDownLatch.await();

        System.out.println("结束");

        // 关闭线程池
        executor.shutdown();
    }

CyclicBarrier

是一组线程之间的相互等待,CyclicBarrier的计数器是可以循环利用的,具备自动重置功能,一旦计数器减到0会自动重置到你设置的初始值。

image.png
    public static void main(String[] args) {
        // 创建线程池,来执行任务
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 3, 5,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                Thread::new,
                new ThreadPoolExecutor.AbortPolicy());

        CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> {
            System.out.println("五一放假了");
            executor.shutdown();
        });

        // 任务A
        executor.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("A完成工作");

            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        // 任务B
        executor.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("B完成学习");

            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        System.out.println("start");
    }
上一篇下一篇

猜你喜欢

热点阅读