Java并发之CyclicBarrier 可重用同步工具类
时间:2022-07-24
本文章向大家介绍Java并发之CyclicBarrier 可重用同步工具类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 package com.thread.test.thread;
2
3 import java.util.Random;
4 import java.util.concurrent.*;
5
6 /**
7 * CyclicBarrier
8 * 同步工具:允许一组线程共同等待一个壁垒点
9 * 适用于固定数量线程的同步
10 * 等待线程释放后可以重复使用
11 *
12 * Created by windwant on 2016/5/27.
13 */
14 public class MyCyclicBarrier {
15 public static void main(String[] args) {
16 ExecutorService es = Executors.newCachedThreadPool();
17 CyclicBarrier cb = new CyclicBarrier(5, new MainTask());//MainTask可选
18 Random r = new Random();
19 es.execute(new SubTask(cb, r.nextInt(10), "task1"));
20 es.execute(new SubTask(cb, r.nextInt(10), "task2"));
21 es.execute(new SubTask(cb, r.nextInt(10), "task3"));
22 es.execute(new SubTask(cb, r.nextInt(10), "task4"));
23 es.execute(new SubTask(cb, r.nextInt(10), "task5"));
24 es.shutdown();
25 }
26 }
27
28 class MainTask implements Runnable {
29
30 public void run() {
31 try {
32 System.out.println("mian task begin");
33 for (int i = 0; i < 5; i++) {
34 Thread.sleep(1000);
35 System.out.println("============" + i + "============");
36 }
37 System.out.println("mian task implemented");
38 } catch (Exception e) {
39 e.printStackTrace();
40 }
41
42 }
43 }
44
45 class SubTask implements Runnable{
46
47 private CyclicBarrier cb;
48
49 private int seconds;
50
51 private String taskName;
52
53 SubTask(CyclicBarrier cb, int seconds, String taskName){
54 this.cb = cb;
55 this.seconds = seconds;
56 this.taskName = taskName;
57 }
58
59 public void run() {
60 try{
61 System.out.println("subtask " + taskName + " begin, need time: " + seconds + "s");
62 long b = System.currentTimeMillis();
63 for (int i = 0; i < seconds; i++) {
64 Thread.sleep(1000);
65 System.out.println("subtask: " + taskName + "============" + i + "============");
66 }
67 long d = System.currentTimeMillis() - b;
68 System.out.println("subtask " + taskName + " over, executing time: " + TimeUnit.SECONDS.convert(d, TimeUnit.MILLISECONDS));
69 cb.await();
70 } catch (InterruptedException e) {
71 e.printStackTrace();
72 } catch (BrokenBarrierException e) {
73 e.printStackTrace();
74 }
75 }
76 }
项目地址:https://github.com/windwant/windwant-demo/tree/master/thread-demo
- MapReduce中的自定义多目录/文件名输出HDFS
- 通过hiveserver远程服务构建hive web查询分析工具
- Hive 中内部表与外部表的区别与创建方法
- 常用统计分析 SQL 在 AWK 中的实现
- java 中 16 进制 HEX 转换成字节码形式的 UTF-8
- Hadoop 多表 join:map side join 范例
- 实战 windows7 下 eclipse 远程调试 linux hadoop
- Hive 在多维统计分析中的应用 & 技巧总结
- shell 学习笔记(18)
- Hive 中的复合数据结构简介以及一些函数的用法说明
- BloomFilter 简介及在 Hadoop reduce side join 中的应用
- 关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
- Hadoop Mapper 阶段将数据直接从 HDFS 导入 Hbase
- 译文 | 量化投资教程:投资组合优化与R实践
- 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 文档注释
- 重磅来袭:腾讯云ClickHouse支持数据均衡服务
- 聊聊claudb的set command
- Flutter通过BasicMessageChannel与Android iOS 的双向通信
- MySQL案例:binlog_row_image如何取舍
- “青柠日报”小程序
- 2020年学习Python-爬取英雄联盟皮肤
- R语言meta分析(10)功能强大的metafor
- Python保留字总结
- Python进阶 | 五分钟带你弄懂迭代器与生成器,夯实代码能力
- [Go]GO语言实战项目-gin框架上传图片文件
- [Go] Golang练习项目-GO语言实现选择排序
- 设计模式~策略模式
- Java单元测试框架(一)——JUnit4
- Java单元测试框架(二)——JUnit5
- 绘制双坐标轴图