文档章节

java并发学习之CountDownLatch

hyfclimber
 hyfclimber
发布于 2013/12/29 12:42
字数 550
阅读 110
收藏 1
点赞 0
评论 0

从java se5开始,java.util.concurrent中就引入了大量设计用来解决并发问题的新类。学习使用这些新类有助于我们编写出更加简单而健壮的并发程序。

今天我们开始学习第一个类:CountDownLatch

他被用来同步一个或多个任务,强制他们等待其他任务执行完毕。

countdownlatch中有一个初始计数值,任何在countdown对象上调用await()方法的任务都将被阻塞,直到初始计数值为0.用来改变初始计数值数值的方法是countdown(),每调用一次,初始值就会减一。这个方法多调用不会引起崩溃和异常,即当调的次数大于初始计数值时,latch.getCount()得到的值都为0。

countdownlatch被设计为只触发一次,计数值不能被重置。我理解是只适用于业务逻辑可以简单地分为两个阶段的情况。比如说,A:所有政治局常委到场,B:开会. A和B的顺序是不能调的。但是A里面哪个常委先到,B里面哪项议程先说,这个都是不重要的。

下面是一个例子。

/**
 * 新类库中的组件
 */
package hyf.concurrent.newLibWidget;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author haoyifeng
 * 
 */

class TaskPortrain implements Runnable
{
    private static int counter = 0;
    private final int id = counter++;
    private static Random rand = new Random(47);
    private final CountDownLatch latch;

    public TaskPortrain(CountDownLatch latch)
    {
        this.latch = latch;
    }

    @Override
    public void run()
    {
        doWork();
        latch.countDown();
    }

    public void doWork()
    {
        try
        {
            TimeUnit.MILLISECONDS.sleep(rand.nextInt(1000));
            System.out.println("latch count is "+latch.getCount());
            System.out.println(this+"completed.");
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

    public String toString()
    {
//        return String.format("%1$-3d", id);
        return id+" ";
    }
}

class TaskWaiting implements Runnable
{
    private static int counter = 0;
    private final int id = counter++;
    private final CountDownLatch latch;

    
    public TaskWaiting(CountDownLatch latch)
    {
        this.latch = latch;
    }


    @Override
    public void run()
    {
        try
        {
            latch.await();
//            latch.wait(); //notify(), notifyAll(),wait(), wait(long), wait(long, int)对应的锁是synchronized.与countdownlatch不是一个东西。
            System.out.println("latch barrier passed for "+this);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
            System.out.println(this+" interrupted.");
        }
    }


    @Override
    public String toString()
    {
        return String.format("TaskWaiting %1$-3d", id);
    }

    
}

public class CountDownLatchTest1
{

    static int SIZE = 100;

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception
    {
        ExecutorService exec = Executors.newCachedThreadPool();
        CountDownLatch latch = new CountDownLatch(SIZE);
        for(int i=0;i<10;i++)
            exec.execute(new TaskWaiting(latch));
        for (int i = 0; i < SIZE; i++)
//            for (int i = 0; i < SIZE+100; i++)
            exec.execute(new TaskPortrain(latch));
//            new TaskPortrain(latch).run();
        System.out.println("all tasks latched. ");
        exec.shutdown();
        {
            
        }
    }

}



© 著作权归作者所有

共有 人打赏支持
hyfclimber
粉丝 0
博文 4
码字总数 2850
作品 0
朝阳
高级程序员
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___ ⋅ 05/06 ⋅ 0

Java 使用 happen-before 规则实现共享变量的同步操作

前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。按照官方的...

stateIs0 ⋅ 01/20 ⋅ 0

Java集合之Vector详解

简介 Vector的内部实现类似于ArrayList,Vector也是基于一个容量能够动态增长的数组来实现的,该类是JDK1.0版本添加的类,它的很多实现方法都加入了同步语句,因此是线程安全的(但Vector其实...

欧阳海阳 ⋅ 06/12 ⋅ 0

Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析 Harries Blog™2018-05-100 阅读 JavaAppcatCountDownLatchActionhttp...

Harries Blog™ ⋅ 05/10 ⋅ 0

使用ConcurrentMap实现高效可靠的原子操作

问题:服务器S1从远程获取多个文件到本地处理。这些文件的数据会被Processor转换成不同类型的数据模型存放至S1的数据库。每个Processor处理逻辑是相互独立的,但是同一个文件的数据可能会被多...

屈想顺 ⋅ 06/14 ⋅ 0

2018年Java编程学习面试最全知识点总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/14 ⋅ 0

计算机科学中抽象的好处与问题—伪共享实例分析

David John Wheeler有一句名言“计算机科学中的任何问题都可以通过加上一层间接层来解决”,一层不够就再加一层。后半句是我加的 (* ̄︶ ̄) ,虽然有点玩笑的意思,但是也的确能说明一些问题...

MageekChiu ⋅ 01/10 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

从Java小白到架构师必须要看的书籍,真正的“武林秘籍”!

少年,我看你骨骼精奇,将是未来万中无一的IT精英,很是适合学JAVA。维护世界和平就看你的了,我这里有能让你成为IT精英的办法!还不来看看! 基础类 1、《Thinking in Java》,入门第一位是...

启示录是真的 ⋅ 05/25 ⋅ 0

Java程序员面试大纲—错过了金三银四,你还要错过2018吗?

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

java高级架构牛人 ⋅ 04/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 15分钟前 ⋅ 0

Java学习路径及练手项目合集

Java学习路径及练手项目合集

颖伙虫 ⋅ 31分钟前 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 56分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部