• Java并发之CountDownLatch工具类


            一、CountDownLatch工具类介绍

            CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作。假设我们有这样的一个需求,我们需要解析一个Excel里多个sheet的据,这个时候我们考虑使用多 线程同时进行工作,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成将数据返回。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作。在这种情况之下我们就可以考虑使用CountDownLatch工具类。

      1 
      2 import java.util.concurrent.CountDownLatch;
      3 
      4 public class CountDownLatchUserCase {
      5 
      6     private static CountDownLatch countDownLatch = new CountDownLatch(5);
      7 
      8     public static void main(String[] args)  throws Exception{
      9         //主线程开始读取Excel文档
     10         new Excel().start();
     11         long count = countDownLatch.getCount();
     12         for(int i = 0;i < count;i++){
     13             new Sheet().start();
     14         }
     15     }
     16 
     17     static class Excel extends Thread{
     18 
     19         @Override
     20         public void run(){
     21             try {
     22                 System.out.println("开始读取Excel文档,共有"+countDownLatch.getCount()+"个工人同时工作");
     23                 countDownLatch.await();
     24             }catch (Exception e){
     25                 e.printStackTrace();
     26             }
     27                 System.out.println("所有Excel文档工作读取完毕");
     28         }
     29     }
     30 
     31     static class Sheet extends Thread{
     32 
     33         @Override
     34         public void run(){
     35             System.out.println(Thread.currentThread().getName() + ",完成sheet读取工作....");
     36             //完成其中一个sheet的工作 count - 1
     37             countDownLatch.countDown();
     38         }
     39 
     40     }
     41 
     42 }
     43 
      1 开始读取Excel文档,共有5个工人同时工作
      2 Thread-4,完成sheet读取工作....
      3 Thread-2,完成sheet读取工作....
      4 Thread-3,完成sheet读取工作....
      5 Thread-1,完成sheet读取工作....
      6 Thread-5,完成sheet读取工作....
      7 所有Excel文档工作读取完毕

            CountDownLatch是通过一个计数器来实现的,当我们在new 一个CountDownLatch对象的时候需要带入该计数器值,该值就表示了线程的数量。每当一个线程完成自己的任务后,计数器的值就会减1。当计数器的值变为0时,就表示所有的线程均已经完成了任务,然后就可以恢复等待的线程继续执行了。

    CountDownLatch类只提供了一个构造器:

      1 public CountDownLatch(int count) {  };  //参数count为计数值

    CountDownLatch类中提供了3个最重要的方法:

      1 public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
      2 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
      3 public void countDown() { };  //将count值减1

            二、CountDownLatch原理分析

            CountDownLatch内部通过共享锁实现。CountDownLatch的构造函数接收一个int类型的参数作为计数器,这个计数器的值也可以理解为该共享锁可以获取的总次数。如果你想等待N个点完 成,这里就传入N。当我们调用CountDownLatch的countDown方法时,N就会减1,当线程调用await方法的时候,程序首先判断count的值是否为0,如果不会0的话则会阻塞当前线程一直等待直到为0为止。

            注意:CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数 器的值。

    CountDownLatch不能回滚重置。

  • 相关阅读:
    easyui-filebox上传图片到阿里
    easyUI-filebox图片上传和预览
    抓网页__第3方库选择_01
    HttpClient示例01
    JSON01_资料
    指定library路径
    Jni_Linux_01_转
    JNI简单步骤01
    JDK_环境变量
    Redis_01
  • 原文地址:https://www.cnblogs.com/gemine/p/9042977.html
Copyright © 2020-2023  润新知