文档章节

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
460
2
Java并发编程之CountDownLatch源码解析

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

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

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

foxeye
2016/02/29
290
0

没有更多内容

加载失败,请刷新页面

加载更多

使用递归打印乘法表

一般我们在学for循环的时候都会去打印九九乘法表,但是如果是用递归的方式打印的话,应该怎么做呢? 下面讲解一下用递归打印九九乘法表的思路: 其实我们在用for循环打印乘法表的时候,用的是...

INEVITABLE
32分钟前
7
0
sql 练习

创建需要的4张表 首先创建student、course、score、teacher这四张表。 student表 创建student表 CREATE TABLE IF NOT EXISTS student(sno TINYINT UNSIGNED NOT NULL,sname VARCHAR(20......

Garphy
33分钟前
11
0
vSphere的两种虚拟交换机

VMware vSphere 6.7中支持两种虚拟交换机: 1、标准交换机,VSS - Virtual Standard Switch 2、分布式交换机,VDS - Virtual Distributed Switch VSS与ESXi主机一一对应,即一个VSS只能部署在...

大别阿郎
35分钟前
10
0
webGL和three.js的关系

本文转载于:专业的前端网站➤webGL和three.js的关系 如今浏览器的功能越来越强大,而且这些功能可能通过JavaScript直接调用。你可以用HTML5标签轻松地添加音频和视频,而且可以在HTML5画布上...

前端老手
今天
8
0
Spring如何实现AOP,请不要再说cglib了!

1. 从注解入手找到对应核心类 最近工作中我都是基于注解实现AOP功能,常用的开启AOP的注解是@EnableAspectJAutoProxy,我们就从它入手。 上面的动图的流程的步骤就是: @EnableAspectJAutoPr...

温安适
今天
41
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部