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();
        }
    }
}
原文地址:https://www.cnblogs.com/fengfuwanliu/p/10267431.html