文档章节

java并发包里的CountDownLatch的用法

汪林
 汪林
发布于 2014/06/18 10:47
字数 456
阅读 1804
收藏 6

CountDownLatch

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

我们现在就把它理解为倒数计数器,什么是倒数计数器呢,通俗的理解就是这个计数器事先有一个初始计数,在这个计数减到0之前,所有的线程等待。

笔者今天早晨又看一则新闻说的高考“枪手”,看来每逢高考,“枪手”必火。那我们来模拟一下“枪手”的招募过程。假如我需要10个“枪手”,招募者一声令下,开始招募,我们开始在大学里张贴“招兵启示”,等到这10个“枪手”都到齐,开动大巴车把他们送到“战场”。

这里笔者需要大家注意两个地方:第一,招募人一声令下,开始招募。第一,只有等到10个“枪手“都到了才能开动大巴。

package com.core.countDownLatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
    
    public static void main(String[] args) throws InterruptedException {
        
        //倒数计数器
        final CountDownLatch begin = new CountDownLatch(1);
        
        //倒数计数器
        final CountDownLatch end = new CountDownLatch(10);
        
        //十名枪手
        ExecutorService execu = Executors.newFixedThreadPool(10);
        
        //模拟招募10名枪手到齐后开动大巴,送往“战场”
        for(int i=0;i<10;i++){
            
            final int NO = i+1;
            
            Runnable r = new Runnable() {
                
                @Override
                public void run() {
                    
                    try {
                        
                        //等待招募者下令招募
                        begin.await();
                        
                        Thread.sleep((long) (Math.random()*10000));
                        
                        System.out.println("枪手:"+NO+"到了");
                        
                    } catch (InterruptedException e) {
                        
                        e.printStackTrace();
                        
                    }finally{
                        
                        //每到达一个枪手,计数器减1
                        end.countDown();
                    }
                }
            };
            
            execu.submit(r);
        }
        
        //begin倒数计数器减1为0,则开始下招募令,一声令下
        begin.countDown();
        
        System.out.println("开始招募。。。。");
        
        //等待所有的枪手到达
        end.await();
        
        //所有枪手到达
        System.out.println("所有枪手到达,开动大巴,送往目的地。。。。");
        
        execu.shutdown();
        
    
    }
}


© 著作权归作者所有

共有 人打赏支持
上一篇: mysql5.6 安装
下一篇: jvm运行时数据区
汪林
粉丝 7
博文 19
码字总数 8847
作品 0
海淀
程序员
私信 提问
Java中高级面试必问之多线程TOP50(含答案)

以下为大家整理了今年一线大厂面试被问频率较高的多线程面试题,由于本人的见识局限性,所以可能不是很全面,也欢迎大家在后面留言补充,谢谢。 1、什么是线程? 2、什么是线程安全和线程不安...

老道士
08/28
0
0
java多线程系列:通过对战游戏学习CyclicBarrier

CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一...

huangzd
01/06
0
0
新Java并发线程控制:CountDownLatch等待所有线程运行完毕才执行

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/83443995 新Java并发线程控制:CountDownLatch等待所有线程运行完毕才执行 创建一批J...

zhangphil
10/28
0
0
新Java并发线程控制:CyclicBarrier等待所有线程到达一个状态后再让全部线程处于一个起跑线(1)

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/83501322 新Java并发线程控制:CyclicBarrier等待所有线程到达一个状态后再让全部线程...

zhangphil
10/29
0
0
JUC锁框架——CountDownLatch

CountDownLatch简单介绍 CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由线程进行减1操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒,实现线程间的同步。 Co...

长头发-dawn
09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

混合模型---logistic模型的混合

专家混合

中国龙-扬科
6分钟前
1
0
自定义参数校验注解 (实现ConstraintValidator方法)

Hibernate Validator常用注解(图网上找的) 2.自定义校验器 a.注解类 @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})@Retention(RUNTIME)@Documented@Constraint(validatedB......

INSISTQIAO
10分钟前
1
0
Integer 实现

Integer 封装类型,参数传递传的是值,不是引用 内带缓存,-128 到127 -128 到127 直接数值 IntegerCache 如果不在这个范围,才会new Integer () public static Integer valueOf(int ...

Java搬砖工程师
10分钟前
1
0
数字IT基础-数据采集总线

数字化运营基础 在如今“双十一”不再是线上活动的代名词,而逐步变为一场线上线下同时进行的消费者盛宴。销售、运营、物流、生产商等都在开足马力在各大渠道备战,据统计: 消费者在期间被平...

阿里云官方博客
18分钟前
0
0
三次握手四次挥手

背景 和女朋友异地恋,为了保持感情我提议每天晚上视频聊天一次。 从好上开始,到现在,一年多也算坚持下来了。 问题: 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,...

瑞查德-Jack
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部