美文网首页
CountDownLatch示例

CountDownLatch示例

作者: zoterap | 来源:发表于2019-02-13 10:32 被阅读321次

    要点

    CountDownLatch:一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成;

    理解

    image.png

    示例

    package com.zoterap.javabasic.current;
    
    import lombok.AllArgsConstructor;
    
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.TimeUnit;
    
    import static java.lang.String.format;
    
    public class CountDownLatchDemo {
    
        private static final int num = 3;
        private static CountDownLatch countDownLatch = new CountDownLatch(num + 1);
        private static Random random = new Random();
    
        /**
         * 运动员线程
         */
        @AllArgsConstructor
        static class SportsManThread extends Thread {
    
            private String name;
    
            @Override
            public void run() {
                int warmUpTime = random.nextInt(3) + 1;
                try {
                    TimeUnit.SECONDS.sleep(warmUpTime);
                    System.out.println(format("[%s]热身[%d]秒", name, warmUpTime));
    
                    /**
                     * 减少闩锁的数量
                     */
                    countDownLatch.countDown();
                    System.out.println(format("[%s]热身完成,已就位", name));
    
                    /**
                     * 线程等待,直到闩锁的数量为0
                     */
                    countDownLatch.await();
                    
                    System.out.println(format("[%d][%s]开跑......", System.currentTimeMillis(), name));
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
        }
    
        public static void main(String[] args) {
            for (int i = 1; i < num + 1; i++) {
                new SportsManThread(i + "号运动员").start();
            }
    
            try {
                countDownLatch.countDown();
                countDownLatch.await();
                System.out.println("所有运用员都已经准备好");
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    }
    
    

    执行结果

    [2号运动员]热身[1]秒
    [2号运动员]热身完成,已就位
    [1号运动员]热身[2]秒
    [3号运动员]热身[2]秒
    [1号运动员]热身完成,已就位
    [3号运动员]热身完成,已就位
    所有运用员都已经准备好
    [1550024832810][1号运动员]开跑......
    [1550024832810][3号运动员]开跑......
    [1550024832810][2号运动员]开跑......
    

    相关文章

      网友评论

          本文标题:CountDownLatch示例

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