利用CountDownLatch实现的一个简单的线程同步场景
2020-05-01 07:18
609 查看
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 2 Worker 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(); } } }汪子熙 博客专家 原创文章 7378获赞 671访问量 145万+ 关注 他的留言板
相关文章推荐
- 利用 CountDownLatch 类实现线程同步
- 利用MailMessage,实现一个简单的mail 发送
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- 利用page rank,hits算法实现的一个简单的文本摘要系统
- 【IOS】利用ASIHTTPRequest 实现一个简单的登陆验证
- 利用泛型实现一个简单的android orm小例子
- Hiredis安装使用及浅析和一个利用Hiredis实现的简单类
- 利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类
- 利用JPanel类 JFrame JButton 以及布局管理类实现的一个简单布局界面
- unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- 利用读写锁简单实现一个缓存demo
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- 利用线性布局和相对布局实现一个简单的页面并且使应用支持国际化语言
- 利用jQuery实现一个简单的表格上下翻页效果
- 利用mechanize Gem实现一个简单的ruby爬虫
- 【Android2D游戏开发十六】(上文之触摸屏手势)详解Android Gesture 手势操作!利用手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 利用ASIHTTPRequest 实现一个简单的登陆验证
- 利用Compass实现一个简单的搜索引擎[转贴]