如何进行并发工具类CountDownLatch与CyclicBarrier分析
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收
千家信息网最后更新 2025年12月03日如何进行并发工具类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安全错误
数据库的锁怎样保障安全
明日之后更新服务器怎么开启
堡垒机数据库安全
徐州互联网服务器科技公司
软件开发三层架构与mvc
获取很多页面的数据库
上海商学院中本贯通网络安全
西安网络安全研讨会
税收网络安全简报
定海华昌软件开发
石景山区网络软件开发联系方式
广播电视网络安全通报机制
网络安全需要数学特别好吗
全国碳预算数据库
计算机网络技术哪个吃香
江苏常州服务器托管租用云空间
最大金融数据库
智能互联网络技术专科就业方向
思科网络技术的感想
电脑打印服务器没有开启
数据库数据的基本查询题库
原点参数网站数据库要钱吗
怎么保护网络安全400字
盐城智能软件开发资费
江夏好的软件开发
网络安全运营总结报告
桂林住宿软件开发
删除数据库自增id
数据库 生日
有关互联网科技发展的词语
怎么查看连接服务器里的网址