利用CountDownLatch实现的一个简单的线程同步场景
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实现的一个简单的线程同步场景相关推荐
- 分享:一个简单的线程池的实现
一个简单的线程池的实现 http://my.oschina.net/hejiula/blog/110519
- 手写一个简单的线程池MyThreadPool
说明 手写的一个简单的线程池,旨在帮助了解线程池的工作原理. 核心内容 核心工作线程 任务阻塞队列 定义一个内部类去实现核心工作线程 /*** 内部类:工作的核心线程*/private final c ...
- 一个简单的线程池设计方案
一个简单的线程池本质上是生产者-消费者模型,一般是线程池负责消费任务,任务分配线程负责生产任务,任务可以由队列.链表或全局变量等数据结构承担.如果生产和消费速度差不多,可以采用环形队列结构:如果任务有 ...
- html与css编程证书,利用CSS布局做一个简单的荣誉证书(代码示例)
本篇文章将给大家介绍如何使用css布局制作一个简单的荣誉证书,有趣且实用,希望对需要的朋友有所帮助! 那么利用css布局实现简单荣誉证书样式的效果是非常简单的,主要用到以下几个基础属性: backgr ...
- 如何利用laragon框架制作一个简单的应用?
如何利用laragon框架制作一个简单的应用? 一.搭建环境 1. 安装Laragon 1.1 打开安装包用的语言 选择自己习惯用的语言 1.2 选择安装地址 1.3 选择Next,开始install ...
- 利用训练数据建立一个简单的分类器
利用训练数据建立一个简单的分类器 在机器学习领域中,分类指的是利用数据的特性将其分成若干类型的过程.分类器则可以是实现分类功能的任意算法,最简单的分类器就是简单的数字函数.在真实世界中,分类器可以是非 ...
- 用Python实现一个简单的线程池
线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收 ...
- Linux下设计一个简单的线程池
定义 什么是线程池?简单点说,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放 ...
- php用户注册功能设计,利用HTML+CSS设计一个简单的用户注册页面【示例】
本篇文章将要给新手小白们介绍如何使用HTML和css制作简单的注册页面.在开发网站过程中,如果网站内容要求是完善的信息站,那么肯定就离不开用户注册的这个功能.这个用户注册界面对于刚入门的前端新手来说, ...
最新文章
- jsp中如何判断el表达式中的BigDecimal==0
- 当 “HTTP” 先生遇上“S”小姐
- 软件开发项目的风险管理 (转)
- 快速判断list是否为空
- VTK:Math之LeastSquares
- atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
- 推荐“公主妄想症系列之二:第一次”
- 导数,微分,偏导,全微分,方向导数,梯度
- C++:41---覆盖和隐藏
- 51单片机——DS18B20
- 云端之战:Thomas Kurian离职,Java 11趋向收费,Ellison豪赌ERP和云数据库
- Metal Framework基础使用教程
- Java中Lambda表达式
- 语音识别系统_智能语音识别系统_第三方语音识别系统 - 云+社区 - 腾讯云
- mongodb 集群shard_MongoDB 分片集群环境搭建
- python的sorted函数和operator.itemgetter函数
- 中国微流体系统市场趋势报告、技术动态创新及市场预测
- Deeplab Training notes
- paypal开发者账户申请步骤(最新最实用)
- APP运营推广,如何做到“饱和攻击”