zoukankan      html  css  js  c++  java
  • Java-JUC(五):闭锁(CountDownLatch)

    闭锁(CountDownLatch)

    jdk5.0在java.util.concurrent包中提供了CountDownLatch,它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:

    1)确保某个计算在其需要的所有资源都被初始化之后才继续执行;

    2)确保某个服务在其他依赖的所有其他服务都已经启动之后才启动;

    3)等待直到某个操作所有参与者都准备就绪在继续执行。

    CountDownLatch的用法:

     CountDownLatch提供了一个await方法,该方式用于等待前边countdownlatch所统计的线程完成后,才可以向下执行,否则一直等待。

    package com.dx.juc.test;
    
    import java.util.concurrent.CountDownLatch;
    
    public class CoutDownLatchTest {
        public static void main(String[] args) {
            Long start=System.currentTimeMillis();
            
            // 线程数
            CountDownLatch countDownLatch=new CountDownLatch(5);
            MyCallable myCallable=new MyCallable(countDownLatch); 
                
            for (int i = 0; i < 5; i++) {
                new Thread(myCallable).start();
            }
            
            try {
                // 等待所有任務完成后,才進行下邊的任務。
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            Long end=System.currentTimeMillis();
            System.out.println("耗时:"+(end-start)+" ms");
        }    
    }
    
    class MyCallable implements Runnable {
        private CountDownLatch countDownLatch;
    
        public MyCallable(CountDownLatch countDownLatch) {
            this.countDownLatch = countDownLatch;
        }
    
        public void run() {
            try {
                int sum = 0;
                for (int i = 0; i <= 100; i++) {
                    sum += i;
                }
                System.out.println(sum);
            } finally {
                countDownLatch.countDown();
            }
        }
    
    }

    CountDownLatch原理及注意事项

    1)CountDownLatch初始化的开启计数个数必须要到达0时,才会跳出等待,这个是等待跳过的一个依赖;

    2)如果该统计个数初始化的值,大于调用countDown()的次数,就会导致线程一直等待状态,如下图:图一;

    3)它实现的原理,就是给CountDownLatch一个初始化统计数,在监控的线程内部操作完成时,调用countDown()函数,调用一次则初始化监控统计数递减1。当调用了CountDownLatch的实例的await函数时,实际上是一直监控是否初始化监控统计数到达0否,一旦到达0,则跳出等待。进行await等待,向下执行。

    图一:

  • 相关阅读:
    【机器学习笔记】EM算法及其应用
    【机器学习笔记】循环神经网络RNN
    【caffe范例详解】
    Caffe on Windows (Visual Studio 2015+CUDA8.0+cuDNNv5)
    【Keras案例学习】 CNN做手写字符分类(mnist_cnn )
    Celery分布式文件队列
    通过nginx+lua或openresty实现web站点的waf功能
    使用docker hub获取kubernetes各个组件的镜像
    使用Ansible快速构建kubernetes1.10.4HA高可用集群
    创建私服maven服务
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/8911077.html
Copyright © 2011-2022 走看看