如何进行并发工具类CountDownLatch与CyclicBarrier分析
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收
千家信息网最后更新 2025年02月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{
@Override
public 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() {
@Override
public 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 block
e.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 ConcurrentHashMapresultMap = 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安全错误
数据库的锁怎样保障安全
怎么察看数据库的字段长度
对于软件开发的瀑布模型
服务器 国内ip
神界下载软件开发
江苏新型网络技术维修电话
web应用数据库性能
株洲网络安全红包
太原网站服务器
邯郸系统软件开发定制费用
飞客数据库
fatc服务器
重庆掌米软件开发联系电话
云南灵鹭天行互联网科技
软件开发服务费税率
网络安全典型案例2019
公安网络安全交流发言
工业企业数据库行业大类标准
文明重启好玩的拆家服务器
互联网下的计算机网络安全
安复仕软件开发
网络安全知识竞赛好卡
软件开发笔记题
中国天象网络技术有限公司
神界下载软件开发
极域课堂的服务器地址
通过ip地址查找服务器所在地
福州区块链软件开发
增值发票开票软件服务器连接失败
数据网络技术行业账务处理
网络安全发展缺口