文档章节

java并发学习之CountDownLatch

hyfclimber
 hyfclimber
发布于 2013/12/29 12:42
字数 550
阅读 112
收藏 1

从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多线程系列:通过对战游戏学习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
【Java并发专题】27篇文章详细总结Java并发基础知识

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

你听___
05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

传播正能量——《海南英才》阅读的读后感2200字

传播正能量——《海南英才》阅读的读后感2200字: 新华社记者12月8日从公安部获悉,针对自媒体“网络水军”敲诈勒索等违法犯罪活动突出问题,今年以来,公安部组织各地公安机关依法深入开展侦...

原创小博客
13分钟前
1
0
Confluence 6 对一个空间进行归档后产生的影响

空间 如果一个空间被归档: 将不会在查找结果中显示,除非你选择 在归档空间中查找(Search archived spaces)。如果没有归档空间的话,这个功能是隐藏的。 页面和内容将不会在 Confluence 的...

honeymose
15分钟前
2
0
java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
今天
4
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
10
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部