[置顶] CountDownLatch的简单用法

标签: CountDownLatch juc java 多线程
30人阅读 评论(2) 收藏 举报
分类:

CountDownLatch类在java.util.concurrent(俗称juc)包下,一般用于一个任务需要等待多个线程执行的结果的情况下,是一个同步辅助类。

主要用到它的方法是

①构造器:设置计数器的数量

 public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }

②await():阻塞当前线程,等待计数器的数量变为0

public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }

③countDown():计数器减一

    public void countDown() {
        sync.releaseShared(1);
    }

demo

package juc;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {
    final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) throws InterruptedException {
        // 两个人比赛跑步
        CountDownLatch latch = new CountDownLatch(2);
        Runner runner1 = new Runner("博尔特", latch, 7000);
        Runner runner2 = new Runner("苏炳添", latch, 8000);
        runner1.start();
        runner2.start();
        // 等待两个运动员都跑完
        latch.await();
        System.out.println("运动员都跑完了,时间"+ sdf.format(new Date()));
    }

    static class Runner extends Thread{
        String runnerName;
        CountDownLatch latch;
        int runTime;
        public Runner(String runnerName,CountDownLatch latch,int runTime) {
            this.runnerName = runnerName;
            this.latch = latch;
            this.runTime = runTime;
        }

        public void run() {
            System.out.println(runnerName+" run begin at " +sdf.format(new Date()));
            // 开始跑步
            doRun();
            System.out.println(runnerName+" run end at " + sdf.format(new Date()));
            // 运动员跑步完成,计数器减一
            latch.countDown();
        }

        private void doRun() {
            try {
                Thread.sleep(runTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

输出结果:

博尔特 run begin at 2018-04-16 12:56:15
苏炳添 run begin at 2018-04-16 12:56:15
博尔特 run end at 2018-04-16 12:56:22
苏炳添 run end at 2018-04-16 12:56:23
运动员都跑完了,时间2018-04-16 12:56:23

查看评论

Java并发编程之——CountDownLatch的使用

最近在开发Android项目的时候有一个需求:在Service中开启多个线程并发的执行任务,当这三个线程执行完毕之后,主线程才能继续往下执行。刚开始使用的是AsyncTask+AtomicIntege...
  • liuyi1207164339
  • liuyi1207164339
  • 2016-06-06 18:54:53
  • 2607

【JAVA】java中CountDownLatch的用法,实例讲解

CountDownLatch主要用于多线程环境中,当所有的线程都countDown了,就会释放所有的等待的线程,await在到0之前一直等待。 直接看一段代码: package thread.th...
  • chiweitree
  • chiweitree
  • 2015-07-30 15:24:57
  • 1359

CountDownLatch、CyclicBarrier、Semaphore共同之处与区别以及各自使用场景

摘要: jdk1.5之后,java的concurrent包提供了一些并发工具类,比如CountDownLatch和CyclicBarrier,Semaphore。这里简要的比较一下他们的共同之处与区别...
  • jackyechina
  • jackyechina
  • 2016-10-26 10:55:09
  • 3016

分析CountDownLatch的实现原理

原文出处:https://www.jianshu.com/p/7c7a5df5bda6CountDownLatch的使用CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由...
  • qq_15769369
  • qq_15769369
  • 2018-03-13 17:15:35
  • 112

countdownlatch的用法

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。...
  • u011490320
  • u011490320
  • 2014-11-11 20:15:43
  • 483

多线程之CountDownLatch和CyclicBarrier的区别和用法

一.CountDownLatch的使用 CountDownLatch经常用于监听某些初始化操作,等初始化执行完毕后,再通知主线程继续工作。 CountDownLatch定义: 一个同步辅助类,在完成...
  • a347911
  • a347911
  • 2016-12-05 16:10:11
  • 624

Java多线程学习之 CountDownLatch 用法介绍

在网上查找了一些资料,其原理及用法总结如下: 参考网址  点击打开链接 CountDownLatch是一种简单的同步模式,它让一个线程可以等待一个或多个线程完成它们的工作从而避免对临界资源并发访问...
  • u012596172
  • u012596172
  • 2018-01-15 09:24:06
  • 58

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

CountDownLatch和CyclicBarrier的主要联系和区别如下: 1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数。 2.CountDownLat...
  • gaolu
  • gaolu
  • 2015-05-29 09:02:51
  • 11035

Java中使用CountDownLatch进行多线程同步

CountDownLatch介绍在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法:1、synchronized关键字进行同步。2、Lock锁接口及其实现类ReentrantLock...
  • zbc1090549839
  • zbc1090549839
  • 2016-12-05 14:37:00
  • 1980
    个人资料
    等级:
    访问量: 402
    积分: 88
    排名: 151万+
    文章分类
    文章存档
    最新评论