博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CountDownLatch分析
阅读量:7021 次
发布时间:2019-06-28

本文共 2749 字,大约阅读时间需要 9 分钟。

 

 

  1 什么是CountDownLatch呢?

  先看看官网的定义 :一种同步帮助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

  现在由我来解释什么是CountDownLatch吧;比如说我当前存在4个线程,其中一个是主线程,3个普通线程。我们要做一个项目,希望线程A负责自动登陆,线程B负责记录登陆日志,线程C负责加载页面信息;而我的主线程则只需要在三者完成后才启动,执行其他的应用;

CountDownLatch(int count) 构造一个用给定计数初始化的 CountDownLatch。

  这是CountDownLatch的构造器,count为当前线程的数量,比如上述我们可以传入一个4;

public void await()throws InterruptedExceptionpublic boolean await(long timeout,TimeUnit unit) throws InterruptedExceptionpublic void countDown()

 await()方法有两个,其中一个指定了超时时间。调用此方法的线程会被挂起,而调用countDown()方法的线程,每一次的调用都会使得之前构造器中的count的值减去1;知道为0时,调用过await()方法的线程会被唤醒,开始执行。

  请看如下的代码:

package com.net;import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountDownLatchDemo {    // 1 创建CountDownLatch对象    private CountDownLatch cdl = new CountDownLatch(2);    // 1.1 生成随机数对象    private Random rnd = new Random();    // 2 第一个线程对象    class FirstTask implements Runnable {        private String id;        public FirstTask(String id) {            this.id = id;        }        @Override        public void run() {            System.out.println("Thread " + id + "  is start");            try {                // 休眠几秒                Thread.sleep(rnd.nextInt(1000));            } catch (Exception e) {                e.printStackTrace();            }            System.out.println("Thread  " + id + "  is over");            // 线程执行完毕调用一次countDown()方法            cdl.countDown();        }    }    // 3 第二个线程对象    class SecondTask implements Runnable {        private String id;        public SecondTask(String id) {            this.id = id;        }        @Override        public void run() {            try {                // 调用await()方法,使得当前线程挂起                cdl.await();            } catch (InterruptedException e) {                e.printStackTrace();            }            //当当前线程被唤醒之后才开始执行            System.out.println("----------Thread  " + id + "  is start");            try {                Thread.sleep(rnd.nextInt(1000));            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("----------Thread " + id + " is over");        }    }    public static void main(String[] args) {            // 创建一个线程池            ExecutorService es = Executors.newCachedThreadPool();            CountDownLatchDemo cdld = new CountDownLatchDemo();            //将c,d交给任务2,说明会被率先挂起            es.submit(cdld.new SecondTask("c"));            es.submit(cdld.new SecondTask("d"));            //将a,b交给任务1开始执行            es.submit(cdld.new FirstTask("a"));            es.submit(cdld.new FirstTask("b"));            es.shutdown();    }}

 

 

转载于:https://www.cnblogs.com/gosaint/p/8444108.html

你可能感兴趣的文章
四阶魔方25步公式_孙氏四阶魔方公式转换助手使用说明
查看>>
python 判断元素是否在set_Python-BeautifulSoup-如何检查ResultSet是否包含elemen
查看>>
宠物龟 扫地机器人_全球首例!360 扫地机器人竟能识别宠物粑粑,从此告别满地翔!...
查看>>
python getchar_python中的getchar返回permission denied(android 8.0)
查看>>
传染病模型python_传染病动力学模型 SI => SIS => SIR => SEIR(python)
查看>>
html天气预报代码_接口测试平台代码实现114:登录态接口10
查看>>
删除mysql数据库后遗留_mysql数据库被删除后怎么恢复
查看>>
mysql一对多怎么聚合多_mysql多对多
查看>>
mysql 并发控制_mysql并发控制
查看>>
mysql处理高并发的架构_mysql高可用架构设计,处理高并发,大流量!
查看>>
pdo_mysql断线重连_Yii2实现Mysql断线重连
查看>>
mysql 创建视图的好处_mysql视图的作用和优点,视图可以更改么?
查看>>
mysql uuid 和int_MySQL之-uuid做主键与int做主键的性能实测对比详解
查看>>
实验三lr1分析法java_Java中9种常见的CMS GC问题分析与解决(四)
查看>>
hive数据库存入mysql_hive 数据库操作
查看>>
mysql 取30行_sql分页取30-40条记录
查看>>
java递归mysql生成树_java递归生成树结构的数据
查看>>
kettle获取当前日期_kettle获取系统时间
查看>>
spark写mysql优化简书_Spark SQL:性能优化
查看>>
mysql gtid 主主_MySQL优化之七--Mysql基于GTID的主从复制
查看>>