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
- 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 文档注释
- 我写了一个R包,简化芯片的差异分析
- 【收藏】万字解析Scipy的使用技巧!
- Python 如何使用 HttpRunner 做接口自动化测试
- Python 爬虫时,高版本 App 如何进行抓包?
- 使用 shell-operator 实现 Operator
- 我们是如何用 K8S 搞定1000个应用的测试环境
- 关于Python 3.9,那些你不知道的事
- urllib, urllib2, urllib3 都是小弟弟
- 使用 Kustomize 定制 Helm Chart
- 装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案
- 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)
- 6个提升效率的pandas小技巧
- 如何用 Python 让微博热搜榜动起来
- 如何用 Python 让微博热搜榜动起来
- 漫画:什么是 “抽象工厂模式” ?