package countdownlatchTest;import java.util.concurrent.CountDownLatch;class Worker {    private String name;        // 名字    private long workDuration;  // 工作持续时间      public Worker(String name, long workDuration) {        this.name = name;        this.workDuration = workDuration;    System.out.println("Worker: " + name + " is assigned with work time: " + workDuration);}      public void doWork() {        System.out.println(name + " begins to work...");        try {            Thread.sleep(workDuration); // 用休眠模拟工作执行的时间        } catch(InterruptedException ex) {ex.printStackTrace();        }System.out.println(name + " has finished the job...");    }
}class WorkerTestThread implements Runnable {    private Worker worker;    private CountDownLatch cdLatch;      public WorkerTestThread(Worker worker, CountDownLatch cdLatch) {        this.worker = worker;        this.cdLatch = cdLatch;    }      @Override    public void run() {        worker.doWork();        // 让工人开始工作        cdLatch.countDown();    // 工作完成后倒计时次数减1    } }public class CountDownLatchTest {private static final int MAX_WORK_DURATION = 5000;  // 最大工作时间    private static final int MIN_WORK_DURATION = 1000;  // 最小工作时间      // 产生随机的工作时间    private static long getRandomWorkDuration(long min, long max) {        return (long) (Math.random() * (max - min) + min);    }      public static void main(String[] args) {    /* 2是次数,不是时间数* 将这个CountDownLatch引用赋给工作线程,每次工作线程完成任务后,调用* CountDownLatch.countDown, 将计数器减一。如果技术器减到0,阻塞的await方法* 才会返回,重新获得控制权*/CountDownLatch latch = new CountDownLatch(2);  // should be exactly 2Worker w1 = new Worker("Jerry Worker 1", getRandomWorkDuration(MIN_WORK_DURATION, MAX_WORK_DURATION));  Worker w2 = new Worker("Jerry Worker 2", getRandomWorkDuration(MIN_WORK_DURATION, MAX_WORK_DURATION));  new Thread(new WorkerTestThread(w1, latch)).start();        new Thread(new WorkerTestThread(w2, latch)).start();          // latch.countDown();try {          // 仅当CountDownLatch的count降低到0时,这个阻塞的方法才会返回latch.await(); System.out.println("All jobs have been finished!");        } catch (InterruptedException e) {            e.printStackTrace();}}
}

利用CountDownLatch实现的一个简单的线程同步场景相关推荐

  1. 分享:一个简单的线程池的实现

    一个简单的线程池的实现 http://my.oschina.net/hejiula/blog/110519

  2. 手写一个简单的线程池MyThreadPool

    说明 手写的一个简单的线程池,旨在帮助了解线程池的工作原理. 核心内容 核心工作线程 任务阻塞队列 定义一个内部类去实现核心工作线程 /*** 内部类:工作的核心线程*/private final c ...

  3. 一个简单的线程池设计方案

    一个简单的线程池本质上是生产者-消费者模型,一般是线程池负责消费任务,任务分配线程负责生产任务,任务可以由队列.链表或全局变量等数据结构承担.如果生产和消费速度差不多,可以采用环形队列结构:如果任务有 ...

  4. html与css编程证书,利用CSS布局做一个简单的荣誉证书(代码示例)

    本篇文章将给大家介绍如何使用css布局制作一个简单的荣誉证书,有趣且实用,希望对需要的朋友有所帮助! 那么利用css布局实现简单荣誉证书样式的效果是非常简单的,主要用到以下几个基础属性: backgr ...

  5. 如何利用laragon框架制作一个简单的应用?

    如何利用laragon框架制作一个简单的应用? 一.搭建环境 1. 安装Laragon 1.1 打开安装包用的语言 选择自己习惯用的语言 1.2 选择安装地址 1.3 选择Next,开始install ...

  6. 利用训练数据建立一个简单的分类器

    利用训练数据建立一个简单的分类器 在机器学习领域中,分类指的是利用数据的特性将其分成若干类型的过程.分类器则可以是实现分类功能的任意算法,最简单的分类器就是简单的数字函数.在真实世界中,分类器可以是非 ...

  7. 用Python实现一个简单的线程池

    线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收 ...

  8. Linux下设计一个简单的线程池

    定义 什么是线程池?简单点说,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放 ...

  9. php用户注册功能设计,利用HTML+CSS设计一个简单的用户注册页面【示例】

    本篇文章将要给新手小白们介绍如何使用HTML和css制作简单的注册页面.在开发网站过程中,如果网站内容要求是完善的信息站,那么肯定就离不开用户注册的这个功能.这个用户注册界面对于刚入门的前端新手来说, ...

最新文章

  1. jsp中如何判断el表达式中的BigDecimal==0
  2. 当 “HTTP” 先生遇上“S”小姐
  3. 软件开发项目的风险管理 (转)
  4. 快速判断list是否为空
  5. VTK:Math之LeastSquares
  6. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
  7. 推荐“公主妄想症系列之二:第一次”
  8. 导数,微分,偏导,全微分,方向导数,梯度
  9. C++:41---覆盖和隐藏
  10. 51单片机——DS18B20
  11. 云端之战:Thomas Kurian离职,Java 11趋向收费,Ellison豪赌ERP和云数据库
  12. Metal Framework基础使用教程
  13. Java中Lambda表达式
  14. 语音识别系统_智能语音识别系统_第三方语音识别系统 - 云+社区 - 腾讯云
  15. mongodb 集群shard_MongoDB 分片集群环境搭建
  16. python的sorted函数和operator.itemgetter函数
  17. 中国微流体系统市场趋势报告、技术动态创新及市场预测
  18. Deeplab Training notes
  19. paypal开发者账户申请步骤(最新最实用)
  20. APP运营推广,如何做到“饱和攻击”

热门文章

  1. PHP学习之[第11讲]新浪微博开放平台 PHP 与 OAuth 接口(1)
  2. leetcode之Insertion Sort List
  3. windows 环境下Eclipse开发MapReduce环境设置
  4. (转载)NET面向上下文、AOP架构模式(实现)
  5. liferay-ui:search-container 用法
  6. 快速安装LNMP环境
  7. 如何在客户端清除fileUpLoad控件的文件路径
  8. 遇到的浏览器问题总结
  9. 求极大子矩阵的两种方法
  10. 蓝桥杯 基础练习 十六进制转八进制