美文网首页
并发编程 - CoundDownLatch

并发编程 - CoundDownLatch

作者: 52HzBoo | 来源:发表于2018-09-03 16:28 被阅读0次

    CoundDownLatch 倒计数器

    CoundDownLatch 多线程执行,比如控制让其余5个线程执行完毕
    再继续执行自身剩余业务。

    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * 模块:【倒计数器】
     * <p>
     * 开发: Bruce.Liu By 2018/8/23 下午9:19 Create
     */
    public class CountDownLatchDemo implements Runnable {
    
        static final CountDownLatch end = new CountDownLatch(10);
        static final CountDownLatchDemo demo = new CountDownLatchDemo();
    
        @Override
        public void run() {
            try {
                Integer rdm = new Random().nextInt(10)*1000;
                //System.err.println(Thread.currentThread().getName()+" 暂停时间:"+rdm);
                Thread.sleep(rdm);//随机暂停
                System.err.println(Thread.currentThread().getName()+" 线程已经执行完毕 ");
                end.countDown();//标示当前线程已经执行完毕
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            ExecutorService ex = Executors.newFixedThreadPool(10);
            for(int i = 0 ; i < 10 ; i ++){
                ex.submit(demo);
            }
            System.err.println("Main异步开始进入等待");
            end.await();//等待
            System.err.println("CountDownLatch 已全部执行完毕 !");
            ex.shutdown();
            System.err.println("测试线程池执行完毕 !");
        }
    
    }
    
    

    执行结果 例:

    Main异步开始进入等待
    pool-1-thread-10 线程已经执行完毕
    pool-1-thread-7 线程已经执行完毕
    pool-1-thread-5 线程已经执行完毕
    pool-1-thread-9 线程已经执行完毕
    pool-1-thread-8 线程已经执行完毕
    pool-1-thread-1 线程已经执行完毕
    pool-1-thread-4 线程已经执行完毕
    pool-1-thread-3 线程已经执行完毕
    pool-1-thread-2 线程已经执行完毕
    pool-1-thread-6 线程已经执行完毕
    CountDownLatch 已全部执行完毕 !
    测试线程池执行完毕 !

    代码解读

    A. main函数创建了一个线程池为10的对象,
    循环执行10次CountDownLatchDemo demo对象
    B. main执行end.await();main主线程被临时挂起,等待10个线程执行完毕。
    C. 线程执行end.countDown();标示当前线程已经执行完毕
    D. 当全部线程执行完毕后,main继续执行剩余的业务代码

    参考:《实战 Java 高并发程序设计》这本书。

    相关文章

      网友评论

          本文标题:并发编程 - CoundDownLatch

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