文档章节

JUC学习之CountDownLatch

james_you
 james_you
发布于 2014/05/04 22:12
字数 380
阅读 231
收藏 0
package countDownLatch;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,
 * 每调用一次countDown()方法,计数器减1,计数器大于0 时,
 * await()方法会阻塞程序继续执行
 * */
public class CountDownLatchTest {
    //启动多个线程,多线程汇总二维数组每行的结果,然后汇总所有结果
    private int[][] data = new int[][] { { 1, 3, 5, 7, 9 }, { 2, 4, 6, 8, 10 } };
    private CountDownLatch countLatch;
    
    public CountDownLatchTest() throws InterruptedException{
        //汇总数
        int total = 0;
        List<MyCaculate> threadList = new ArrayList<MyCaculate>();
        // 启动二维数组行数个线程
        int threadCount = data.length;
        countLatch = new CountDownLatch(threadCount);
        for(int i=0;i<threadCount;i++){
            MyCaculate caculate = new MyCaculate(data[i],countLatch);
            caculate.setName("caculate-thread-"+i);
            caculate.start();
            //System.out.println(caculate.isDone());
            threadList.add(caculate);
        }
        //阻塞所有线程计算完成
        countLatch.await();
        //
        for(MyCaculate c:threadList){
            /*while(true){
                if(c.isDone()){
                    total+=c.getSum();
                    break;
                }
            }*/
            //因为上面await会阻塞到所有线程完成,所以,不用判断isDone
            total+=c.getSum();
        }
        System.out.println("--------------------------------------");
        System.out.println("各行汇总结果操作完成,汇总结果:"+total);
    }
    
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        CountDownLatchTest c = new CountDownLatchTest();
    }

}
class MyCaculate extends Thread
{
    private CountDownLatch countLatch;
    private int[] row;
    private int sum;
    private boolean isDone = false;
    
    public MyCaculate(int[] row,CountDownLatch countLatch){
        this.row = row;
        this.countLatch = countLatch;
    }
    
    @Override
    public void run() {
        
        try {
            System.out.println(Thread.currentThread().getName()+" 开始计算");
            for(int i:row){
                sum+=i;
            }
        }finally{
            //做完,计数器减1
            countLatch.countDown();
        }
        isDone = true;
    }
    public int getSum(){
        return sum;
    }
    public boolean isDone(){
        return isDone;
    }
}

可以比较一下和CyclicBarrier的区别,Barrier是阻塞的地方,在每个具体的线程,而CountDownLatch,阻塞在节点上。搞得CountDownLatch反而有点关卡的意思。

© 著作权归作者所有

james_you
粉丝 5
博文 25
码字总数 12119
作品 0
长宁
技术主管
私信 提问
CountDownLatch源码解析

CountDownLatch 相比ReentranceLock,CountDownLatch的流程还是相对比较简单的,CountDownLatch也是基于AQS,它是AQS的共享功能的一个实现。 下面从源代码的实现上详解CountDownLatch。 1、C...

maxam0128
2018/01/23
0
0
JUC整体架构图

JUC相关整体框架图 整体架构.png JUC相关UML图 reentrantlock uml图 reentrantreadwritelock uml图 countdownlatch uml图 semaphore uml图 cyclicbarrier uml图...

小鱼嘻嘻
2018/01/18
0
0
主线程等待子线程完成后执行的实现方式

被面试是一种狠高效的学习方式。 前几天被人面试问到了,我当时直接说用CountDownLatch(后面就呵呵了...)后来阅读了点资料,仔细想了想总结如下。 古老的wait notify 下面是一个报错的例子...

夜辰
2018/05/19
380
2
Java并发编程之CountDownLatch源码解析

一、导语 最近在学习并发编程原理,所以准备整理一下自己学到的知识,先写一篇CountDownLatch的源码分析,之后希望可以慢慢写完整个并发编程。 二、什么是CountDownLatch CountDownLatch是j...

星爵22
04/18
384
3
Java 多线程系列目录(共43篇)

Java多线程系列目录(共43篇) 最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 ...

foxeye
2016/02/29
277
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 集成 pageoffice,实现在线打开,编辑,保存 word 文件

一. 构建Sping Boot + Thymeleaf框架的项目(不再详述): 新建一个maven project项目:springboot-pageoffice-demo。 修改pom.xml配置,把项目配置为Spring Boot项目; 配置Thymeleaf: 添...

qianxi
8分钟前
2
0
Git | CentOS 7搭建git服务端

大多数情况下我们使用github托管,特别是私库免费以后,但是github被黑也会有宕机的时候,那怎么办呀,就是喜欢用git呀,特别是微信小程序的官方编辑器用svn时代码颜色不更改呀(不知道版本更...

所谓向日葵族
9分钟前
2
0
第五章 spring-connet之核心类PostProcessorRegistrationDelegate与BeanFactoryPostProcessor体系

前言 前面讲了reser方法, PostProcessorRegistrationDelegate核心方法 invokeBeanFactoryPostProcessors 执行BeanDefinitionRegistry接口与 BeanDefinitionRegistryPostProcessor接口的实现......

鸟菜啊
11分钟前
4
0
工作流快速开发ccflow授权代办操作

关键词:工作流快速开发平台 工作流流设计 业务流程管理 Java工作流引擎 asp.net 开源工作流 net开源工作流引擎 开源工作流系统 一.授权代办开发背景 应用需求:项目审批人出差无法及时处理,...

孟娟
15分钟前
4
0
VIVE 追踪器 VIVE Tracker VR设备研究

设备的冲突 一但打开这追踪器 将会有某一只VR手柄无法启动, 关闭这追踪器 两只VR手柄都能启动 程序中设备的检测 因为是占用手柄的位, 所以可以用手柄的检测方式, 能检测到, 设备号是2 没检测...

洛克人杰洛
18分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部