zoukankan      html  css  js  c++  java
  • CountDownLatch(闭锁)

    CountDownLatch是一个非常实用的多线程控制工具类。常用的就下面几个方法:

    CountDownLatch(int count) //实例化一个倒计数器,count指定计数个数  
    countDown() // 计数减一  
    await() //等待,当计数减到0时,所有线程并行执行  
    

    对于倒计数器,一种典型的场景就是火箭发射。在火箭发射前,为了保证万无一失,往往还要进行各项设备、仪器的检测。只有等到所有的检查完毕后,引擎才能点火。那么在检测环节当然是多个检测项可以同时进行的。代码实现:

    /**
     * @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
     * @Date: 2019-5-4 0004 9:43
     * @Description: 倒计时器示例:火箭发射
     */
    public class CountDownLatchDemo implements Runnable{
    
        static final CountDownLatch latch = new CountDownLatch(10);
        static final CountDownLatchDemo demo = new CountDownLatchDemo();
    
        @Override
        public void run() {
            // 模拟检查任务
            try {
                Thread.sleep(new Random().nextInt(10) * 1000);
                System.out.println("check complete");
    
                //计数减一
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    
        public static void main(String[] args) throws InterruptedException {
            ExecutorService exec = Executors.newFixedThreadPool(10);
            for (int i=0; i<10; i++){
                exec.submit(demo);
            }
    
            // 等待检查
            latch.await();
    
            // 发射火箭
            System.out.println("Fire!");
            // 关闭线程池
            exec.shutdown();
        }
    }
    

    上述代码中我们先生成了一个CountDownLatch实例。计数数量为10,这表示需要有10个线程来完成任务,等待在CountDownLatch上的线程才能继续执行。latch.countDown();方法作用是通知CountDownLatch有一个线程已经准备完毕,倒计数器可以减一了。latch.await()方法要求主线程等待所有10个检查任务全部准备好才一起并行执行。

    作者:RelaxHeart网站长王琦
    链接:https://www.jianshu.com/p/f17692e9114f
    来源:简书

  • 相关阅读:
    Ext js-02 -官方API文档使用
    [Python3网络爬虫开发实战] 1.1-Python3的安装
    什么是关系型数据库?
    htaccess分布式配置文件常用写法
    PHP无限极分类
    svn在linux上的安装
    优化Web中的性能
    Python 面向对象(初级篇)
    文本日期提取
    HMM分词实例
  • 原文地址:https://www.cnblogs.com/yiweiblog/p/11155236.html
Copyright © 2011-2022 走看看