• CountDownLatch闭锁


    CountDownLatch闭锁

    一、前言

      Java 5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。

      CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

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

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

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

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

    二、代码示例

     1 package me.concurrrent.cdl;
     2 
     3 import java.util.concurrent.CountDownLatch;
     4 
     5 /**
     6  * CountDownLatch :闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行
     7  */
     8 public class TestCountDownLatch {
     9 
    10     public static void main(String[] args) {
    11     /**
    12      * CountDownLatch翻译为中文就是倒计时阀门,每一个线程执行完成,构造器中的数字递减1
    13      */
    14     final CountDownLatch latch = new CountDownLatch(50);
    15     LatchDemo ld = new LatchDemo(latch);
    16 
    17     long start = System.currentTimeMillis();
    18 
    19     for (int i = 0; i < 50; i++) {
    20         new Thread(ld).start();
    21     }
    22 
    23     try {
    24         /**
    25          * 在latch.countDown();没有减为零之前主线程要等待
    26          */
    27         latch.await();
    28     } catch (InterruptedException e) {
    29     }
    30 
    31     long end = System.currentTimeMillis();
    32 
    33     System.out.println("耗费时间为:" + (end - start));
    34     }
    35 
    36 }
    37 
    38 class LatchDemo implements Runnable {
    39 
    40     private CountDownLatch latch;
    41 
    42     public LatchDemo(CountDownLatch latch) {
    43     this.latch = latch;
    44     }
    45 
    46     @Override
    47     public void run() {
    48     //synchronized代码块保证线程安全问题
    49     synchronized (this) {
    50         try {
    51         for (int i = 0; i < 50000; i++) {
    52             if (i % 2 == 0) {
    53             System.out.println(i);
    54             }
    55         }
    56         } finally {
    57         /**
    58          * try-finally语句块保证这段代码一定执行 
    59          * 每执行一次,CountDownLatch构造器中的数字减一
    60          */
    61         latch.countDown();
    62         }
    63     }
    64 
    65     }
    66 
    67 }
    View Code

      要说的都在代码注释中了,有什么疑惑,欢迎评论区留言

      哈哈,这大概是我发的最短的一篇博文了

  • 相关阅读:
    VS2010如何以管理员权限启动? 转载
    ArcGIS属性编辑字符型字段值出现乱码问题
    点批量移动到线上(ArcGis版) 转载
    C#判断数据库中取出的字段值是否为空(NULL) .
    方框内打勾(钩)的符号(word和excel)
    C# 获取屏幕的大小
    神通数据库的备份和还原
    推荐系列文章:《DotText源码阅读》
    Lucene.Net 2.3.1开发介绍 —— 阅读索引(转载)
    Lucene.Net:使用eaglet的盘古分词进行分词和搜索(转载)
  • 原文地址:https://www.cnblogs.com/albertrui/p/8401187.html
Copyright © 2020-2023  润新知