如何进行并发工具类CountDownLatch与CyclicBarrier分析
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收
千家信息网最后更新 2026年11月04日如何进行并发工具类CountDownLatch与CyclicBarrier分析
如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
CountDownLatch
基本的流程是一个线程等待其他的线程完成工作以后再执行,加强版join
类的主要方法,await用来等待,countDown(在线程里面)用来减一。
由初始化线程决定是否放行。
我们来用代码演示下CountDownLatch的基本使用:
public class UserCountDownLatch {static CountDownLatch latch = new CountDownLatch(6);//初始化线程private static class InitThread implements Runnable{@Overridepublic void run() {System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work ...");latch.countDown();//初始化线程完成工作了。扣一次}}public static void main(String[] args) throws InterruptedException {//单独的初始化线程,初始化分为2步,需扣减两次new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(1000);System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work step lst.....");latch.countDown();//每完成一步工作,就扣减一次System.out.println("begin step 2nd......");Thread.sleep(1000);System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work step 2nd.....");latch.countDown();//每完成一步工作,就扣减一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();for(int i=0;i<=3;i++){Thread thread = new Thread(new InitThread());thread.start();}latch.await();System.out.println("Main do ites work ....");}}
结果:
Thread_14 ready init work ...Thread_12 ready init work ...Thread_11 ready init work ...Thread_13 ready init work ...Thread_10 ready init work step lst.....begin step 2nd......Thread_10 ready init work step 2nd.....Main do ites work ....
小结:就必须等到countDown减完才开始执行main方法后面的程序。
CyclicBarrier
让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行。
由工作线程决定是否运行。
我们来用代码演示下CyclicBarrier的基本使用:
public class UseCyclicBarrier { private static CyclicBarrier barrier = new CyclicBarrier(5,new CollectThread());//屏障开放后,CollectThread()就会执行. private static ConcurrentHashMap resultMap = new ConcurrentHashMap();//存放子线程工作结果的容器 public static void main(String[] args){ for(int i=0;i<=4;i++){ Thread thread = new Thread(new SubThread()); thread.start(); } } //负责屏障开放以后的工作 private static class CollectThread implements Runnable{ @Override public void run() { StringBuilder result = new StringBuilder(); for(Map.Entry workResult:resultMap.entrySet()){ result.append("["+workResult.getValue()+"]"); } System.out.println("the result = "+result); System.out.println("do other business......"); } } //工作线程 private static class SubThread implements Runnable{ @Override public void run() { long id = Thread.currentThread().getId(); resultMap.put(Thread.currentThread().getId()+"", id); Random r = new Random();//随机决定工作线程的是否睡眠 try{ if(r.nextBoolean()){ Thread.sleep(2000+id); System.out.println("Thread_"+id+".....do its business "); } System.out.println(id+".....is await"); barrier.await();// Thread.sleep(1000+id); System.out.println("Thread_"+id+".....do its business "); }catch(Exception e){ e.printStackTrace(); } } } } 小结:在初始化的时候,开放屏障后,可以使用指定执行的线程。
CyclicBarrier(int parties,RunnablebarrierAction)
不同在于动作的实施者是不同的,CountDownLatch 的下一步动作实施者是main函数,而CyclicBarrier下一步的动作实施者可以为其他线程。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
线程
工作
屏障
开放
动作
实施者
不同
代码
小结
方法
结果
帮助
演示
运行
阻塞
工具
分析
清楚
内容
函数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云南咖啡
精品咖啡豆
广州万易互联网科技有限公司
科技企业和互联网企业
互联网巨头科技公司
广州互联网络科技有限公司
万达互联网科技
金融科技和互联网金融
广州慧亚互联网科技怎么样
字节跳动和互联网科技
科技互联网大厂
互联网公司科技股
互联网科技革命什么开始
互联网科技产业特征
搜狐科技互联网
互联网科技和信息
内蒙古九一互联网科技
无锡工业互联网科技有限公司
2021互联网科技公司排名
重庆科技产业互联网有哪些
融势互联网科技
互联网科技咨询
互联网公司会议桌创意科技软装饰
福州新华互联网科技学校 知乎
上海宁丞科技互联网
四川慕妮娅互联网科技有限公司
工业互联网山东科技大学
美国互联网科技实力
杭州披云加互联网科技有限公司
上海创道互联网络科技有限公司