Java核心知识点学习----线程同步工具类,CyclicBarrier学习
2023-09-14 09:00:18 时间
线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发.
1.效果如下:
2.实现代码:
package com.amos.concurrent; import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @ClassName: CyclicBarrierTest * @Description: 线程同步工具类,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发,日常应用中较少涉及 * @author: amosli * @email:hi_amos@outlook.com * @date Apr 25, 2014 1:35:34 AM */ public class CyclicBarrierTest { public static void main(String[] args) { final CyclicBarrier cyclicBarrier = new CyclicBarrier(3); ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); for(int i=0;i<3;i++){ Runnable runnable = new Runnable() { public void run() { try { Thread.sleep(new Random().nextInt(1000)); } catch (Exception e1) { e1.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点1"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人")); try { cyclicBarrier.await(); } catch (Exception e1) { e1.printStackTrace(); } try { Thread.sleep(new Random().nextInt(1000)); } catch (Exception e1) { e1.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点2"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人")); try { cyclicBarrier.await(); } catch (Exception e1) { e1.printStackTrace(); } } }; newCachedThreadPool.execute(runnable); } newCachedThreadPool.shutdown(); } }
3.用法:
1),如何创建?
CyclicBarrier cyclicBarrier = new CyclicBarrier((int parties); CyclicBarrier cyclicBarrier =new CyclicBarrier(int parties, Runnable barrierAction)
2).如何控制线程到一个集结点?
cyclicBarrier.await();
调用await()方法即可.
同时可以设置最长待时间,只需要调用await(long timeout, TimeUnit unit)方法即可.
3)如何打破障碍?
breakBarrier();
调用breakBarrier() 方法将可以打破当前的障碍.
如果看其内部实现方法不难发现关于Lock锁的应用.
相关文章
- ubuntu java 卸载_ubuntu 怎么卸载java「建议收藏」
- import java.io 是什么意思_Java IO 详解
- 编写java判断闰年_用Java程序判断是否是闰年的简单实例[通俗易懂]
- java中applet是什么意思_Java Applet与Java Application的区别
- java启动器_JAVA基础:Java 启动器如何查找类
- Java Web(四)JS
- java中json字符串和java对象的转换「建议收藏」
- java 配置事务回滚_Spring@Transactional事务回滚
- Flink使用Table和SQL语法操作Hive(Java版)
- 校园论坛(Java)—— 考研学习模块
- 【Java】十个需要知道的特性
- Java加密解密DESUtil、TripleDESUtil详解编程语言
- Java.util.EnumMap 示例详解编程语言
- Java学习笔记之九java二维数组及其多维数组的内存应用拓展延伸详解编程语言
- java在开发过程中经常使用的的知识点详解编程语言
- 实现使用Java实现Redis消息队列(redis消息队列java)
- 清理Redis Java精准过期清理(redisjava过期)
- Java与Redis实现的数据过期机制(redisjava过期)
- 面试前准备:Java技术和Redis快速入门(java面试redis)
- 时间给Java应用程序中的Redis设置过期时间(redisjava过期)
- 在Linux环境下轻松搭建Java开发环境(linux下搭建java)
- 使用Java连接MySQL实现查询功能(java连接mysql查询)
- 解决Java使用Redis超时问题(javaredis超时)
- 实现高并发:Java利用Redis秒杀成功(java秒杀redis)
- Linux与Java调用C编程实战(linux java调c)
- 基于Linux操作系统上实现 Java 编程(linux r java)
- Oracle和Java结合,推出新一代商城系统(java oracle商城)
- MySQL和Java结合的必备工具MySQL下载Java(mysql下载java)
- 零基础写Java知乎爬虫之先拿百度首页练练手