Java并发之CountDownLatch 多功能同步工具类
时间:2022-07-24
本文章向大家介绍Java并发之CountDownLatch 多功能同步工具类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 package com.thread.test.thread;
2
3 import java.util.Random;
4 import java.util.concurrent.*;
5
6 /**
7 * CountDownLatch
8 * 同步策略 允许一个或多个线程等待一些列其它线程操作完成后执行
9 * 由给定count初始化
10 * await方法等待所有等待线程countDown方法执行之后释放
11 * count不能重置,只能使用一次 对比CyclicBarrier
12 * 多用途同步工具:
13 * 初始化为1的CountDownLatch可以作为 on/off开关;所有线程等待直到所有线程都执行了countDown gate效果
14 * 初始化为N....
15 *
16 * 必须等待所有线程都执行完成后才能让所有线程继续执行时其比较有用的特性
17 *
18 * Created by windwant on 2016/5/27.
19 */
20 public class MyCountDownLatch {
21
22 public static void main(String[] args) throws InterruptedException {
23 ExecutorService es = Executors.newCachedThreadPool();
24 CountDownLatch cd = new CountDownLatch(5);
25 Random r = new Random();
26 es.execute(new SubWork(cd, r.nextInt(10), "task1"));
27 es.execute(new SubWork(cd, r.nextInt(10), "task2"));
28 es.execute(new SubWork(cd, r.nextInt(10), "task3"));
29 es.execute(new SubWork(cd, r.nextInt(10), "task4"));
30 es.execute(new SubWork(cd, r.nextInt(10), "task5"));
31 cd.await();
32 es.execute(new MainWork());
33 es.shutdown();
34 }
35
36
37 }
38
39 class MainWork implements Runnable {
40
41 public void run() {
42 try {
43 System.out.println("mian task begin");
44 for (int i = 0; i < 5; i++) {
45 Thread.sleep(1000);
46 System.out.println("============" + i + "============");
47 }
48 System.out.println("mian task implemented");
49 } catch (Exception e) {
50 e.printStackTrace();
51 }
52 }
53 }
54
55 class SubWork implements Runnable{
56
57 private CountDownLatch cd;
58
59 private int seconds;
60
61 private String taskName;
62
63 SubWork(CountDownLatch cd, int seconds, String taskName){
64 this.cd = cd;
65 this.seconds = seconds;
66 this.taskName = taskName;
67 }
68
69 public void run() {
70 try{
71 System.out.println("subwork " + taskName + " begin, need time: " + seconds + "s");
72 long b = System.currentTimeMillis();
73 for (int i = 0; i < seconds; i++) {
74 Thread.sleep(1000);
75 System.out.println("subtask: " + taskName + "============" + i + "============");
76 }
77 long d = System.currentTimeMillis() - b;
78 System.out.println("subwork " + taskName + " over, executing time: " + TimeUnit.SECONDS.convert(d, TimeUnit.MILLISECONDS));
79 cd.countDown();
80 } catch (InterruptedException e) {
81 e.printStackTrace();
82 }
83 }
84 }
项目地址:https://github.com/windwant/windwant-demo/tree/master/thread-demo
- Shell常用命令小结
- 插入法排序
- ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
- 震惊了!这样的js面试题让所有人-男默女泪
- 前端知识学了却不会用,都是没走心
- var a="xx";a=a+"ss";a的值变了,但"xx"字符串并没有变
- 先行者计划--1109微课总结 | 《通过二个demo初识webPack》
- 先行者计划--1107微课 《什么是Vuex?》| 文字简版
- 脱离前端菜鸟层次的二个关键点
- 【课堂笔记】先行者 3.0版本的vueJs课程的第三次课
- ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
- 【课堂笔记】先行者 3.0版本的vueJs课程的第二次课
- 用Python做证券指数的三种策略分析
- 明确告诉你,眼界不够,JS再好也成不了好前端
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 第三章--第二节:循环语句
- 第三章--第三节:列表
- 第三章--第三节(补充):列表排序
- 第三章--第四节:字典
- 2020最新Android面筋:太难了!历经一周对接6个面试官后,我的头条Offer终于来了!
- 第三章--第五节:集合
- Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
- JavaWeb - Linux Operating System
- 第三章--第六节:元祖
- JavaWeb - 开发环境搭建和 Shell 编程
- 第四章--第一节:函数
- 教育平台项目后台管理系统:接口文档
- 第四章--第二节:类
- 教育平台项目后台管理系统:介绍与搭建
- Python办公自动化之Excel做表自动化:全网最全,看这一篇就够了!