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
- POI -纯java代码实现导出excel表格
- 程序员必知的8大排序(java实现)
- Struts2 s2-032远程代码执行分析
- 微信企业号二次开发--自定义菜单接口开发--应用中心
- 微信最新自定义菜单事件
- 微信JSSDK分享到朋友圈和朋友自定义内容功能实现
- 无线安全渗透测试套件WiFi-Pumpkin新版本发布
- Java使用QQ邮箱给其他邮箱发邮件
- 从wireshark抓包开始学习https
- 用于时间序列预测的Python环境
- Pandoc安装实现Markdown转PDF (CentOS6)
- String类replaceAll方法正则替换深入分析
- 微信硬件平台对接--蓝牙
- 初试git+github(linux环境)
- 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 文档注释
- Head First设计模式——蝇量模式和解释器模式
- 【每日一题】33. Search in Rotated Sorted Array
- 【每日一题】34. Find First and Last Position of Element in Sorted Array
- 【每日一题】35. Search Insert Position
- Head First设计模式——原型模式和访问者模式
- Java 新特性前瞻:封印类
- 每天手撕一道算法题-130. 被围绕的区域
- C#实现前向最大匹、字典树(分词、检索)
- Tomcat 中文乱码,设置UTF-8
- 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper
- IDEA将Maven项目中指定文件夹下的xml等文件编译进classes
- 数据误操作,教你使用ApexSQLLog工具从 SQLServer日志恢复数据!
- 从零搭建Spring Boot脚手架(5):整合 Mybatis Plus
- SQL Server数据库阻塞,死锁查询
- 如何优雅地写出大规模线性规划的对偶