美文网首页
CountDownLatch和CyclicBarrier

CountDownLatch和CyclicBarrier

作者: lconcise | 来源:发表于2021-05-07 07:04 被阅读0次

    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");
        }
    

    相关文章

      网友评论

          本文标题:CountDownLatch和CyclicBarrier

          本文链接:https://www.haomeiwen.com/subject/yplnrltx.html