zoukankan      html  css  js  c++  java
  • Java多线程-----理解CountDownLatch

       CountDownLatch简介    

         CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存

    在于java.util.concurrent包下。CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行

       CountDownLatch工作原理

         CountDownLatch.java类中定义的构造函数:public CountDownLatch(int count)

     

         构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。

    与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个

    方法上阻塞,直到其他线程完成各自的任务。其他N 个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。这种通知

    机制是通过 CountDownLatch.countDown()方法来完成的;每调用一次这个方法,在构造函数中初始化的count值就减1。所以当N个线程都调 用了这个方法,

    count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务

       使用CountDownLatch实例

    package com.thread.countdownlatch;
    
    import java.util.concurrent.CountDownLatch;
    
    /**
     * CountDownLatch :闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行
     * 
     * @author yyx 2019年1月14日
     */
    public class CountDownLatchDemo {
        public static void main(String[] args) {
            //所有线程公用一个CountDownLatch对象
            CountDownLatch latch = new CountDownLatch(20);
            LatchDemo ld = new LatchDemo(latch);
            
            long start = System.currentTimeMillis();
            
            for (int i = 0; i < 20; i++) {
                new Thread(ld).start();
            }
            try {
                latch.await();
            } catch (InterruptedException e) {
            }
            long end = System.currentTimeMillis();
            
            System.out.println("耗费时间为:" + (end - start));
        }
    }
    
    class LatchDemo implements Runnable {
        private CountDownLatch latch;
    
        public LatchDemo(CountDownLatch latch) {
            this.latch = latch;
        }
    
        @Override
        public void run() {
            try {
                for (int i = 0; i < 50000; i++) {
                    if (i % 2 == 0) {
                        System.out.println(i);
                    }
                }
            } finally {
                latch.countDown();
            }
        }
    }
  • 相关阅读:
    hdoj 4006 The kth great number【优先队列】
    hdoj 1509 Windows Message Queue【优先队列】
    nyoj 55 懒省事的小明【优先队列】
    hdoj 1896 Stones【优先队列】
    nyoj 757 期末考试【优先队列+贪心】
    hdoj 2147 kiki's game【博弈】
    hdoj 1873 看病要排队【优先队列】
    hdoj 1789 Doing Homework again
    nyoj 1036 非洲小孩【贪心区间选点】
    转:栈和队列小知识【STL用法】
  • 原文地址:https://www.cnblogs.com/fengfuwanliu/p/10267431.html
Copyright © 2011-2022 走看看