当前位置: 首页 > news >正文

可信赖的赣州网站建设东莞培训网站建设

可信赖的赣州网站建设,东莞培训网站建设,网页设计页面,网站建设小西门文章目录 一.CountDownLatch 和 CyclicBarrier的区别二.详解总结用法CountDownLatch 用法CyclicBarrier 用法 一.CountDownLatch 和 CyclicBarrier的区别 CountDownLatch和CyclicBarrier都是线程同步的工具类#xff0c;都是基于AQS实现的#xff1b;CountDownLatch 的计数器… 文章目录 一.CountDownLatch 和 CyclicBarrier的区别二.详解总结用法CountDownLatch 用法CyclicBarrier 用法 一.CountDownLatch 和 CyclicBarrier的区别 CountDownLatch和CyclicBarrier都是线程同步的工具类都是基于AQS实现的CountDownLatch 的计数器是大于或等于线程数的而CyclicBarrier是一定等于线程数CountDownLatch 放行由其他线程控制而CyclicBarrier是由本身来控制的CountDownLatch允许一个或多个线程一直等待直到这些线程完成它们的操作而CyclicBarrier不一样它往往是当线程到达某状态后暂停下来等待其他线程等到所有线程均到达以后才继续执行二者的等待主体是不一样的CountDownLatch调用await()通常是主线程/调用线程而CyclicBarrier调用await()是在任务线程调用的CountDownLatch 操作的是事件阻塞足够多的次数即可不管几个线程而 CyclicBarrier 侧重点是线程强调多个线程间互相等待同时结束CountDownLatch 是不可以重置的所以无法重用而 CyclicBarrier 则没有这个限制可以重用 二.详解 CountDownLatch是通过计数器实现每次完成一个任务后计数器减一当为0时CountDownLatch.await()方法的线程就可以恢复执行任务。 CountDownLatch是基于AQS实现的它的实现机制很简单当我们在构建CountDownLatch对象时传入的值其实就会赋值给 AQS 的关键变量state执行countDown方法时其实就是利用CAS 将state 减一执行await方法时其实就是判断state是否为0不为0则加入到队列中将该线程阻塞掉除了头结点因为头节点会一直自旋等待state为0当state为0时头节点把剩余的在队列中阻塞的节点也一并唤醒。 CyclicBarrier是直接借助ReentrantLock加上Condition 等待唤醒的功能 进而实现的在构建CyclicBarrier时传入的值会赋值给CyclicBarrier内部维护count变量也会赋值给parties变量这是可以复用的关键每次调用await时会将count -1 操作count值是直接使用ReentrantLock来保证线程安全性如果count不为0则添加则condition队列中如果count等于0时则把节点从condition队列添加至AQS的队列中进行全部唤醒并且将parties的值重新赋值为count的值实现复用 总结 CountDownlatch基于AQS实现会将构造CountDownLatch的入参传递至statecountDown()就是在利用CAS将state减-1await()实际就是让头节点一直在等待state为0时释放所有等待的线程 CyclicBarrier则利用ReentrantLock和Condition自身维护了count和parties变量。每次调用await将count-1并将线程加入到condition队列上。等到count为0时则将condition队列的节点移交至AQS队列并全部释放。 用法 CountDownLatch 用法 从代码层面CountDownLatch 的用法是 // 设置10个计数 CountDownLatch countDownLatch new CountDownLatch(10); // 每次调用即可减1 countDownLatch.countDown(); // 其他线程一直等待减到0后才继续执行 countDownLatch.await()举个栗子 假设有一个业务场景我们要求把所有的图片上传到文件服务器然后将图片的地址URL保存到数据库; 其中上传素材我们可以使用多线程去上传都上传完之后再入库。 publicbooleandealVedoi(ListVediovedioList){//每个线程处理的最大任务数intmaxNum10;intthreadNums0;MapString,StringmapnewConcurrentHashMapString,String((int)(vedioList.size()/0.75));if(vedioList.size()maxNum){threadNums1;}else{//获取当前系统可用的处理器核心数量threadNumsRuntime.getRuntime().availableProcessors()vedioList.size()/maxNum?vedioList.size()/maxNum:Runtime.getRuntime().availableProcessors();}try{//创建固定线程数处理这批任务ExecutorServiceexecutorExecutors.newFixedThreadPool(threadNums);CountDownLatchcountDownLatchnewCountDownLatch(vedioList.size());IteratorVedioiteratorvedioList.iterator();while(iterator.hasNext()){executor.submit(()-{Vediovedioiterator.next();Stringurlstore(vedio);map.put(vedio.getName());countDownLatch.countDown();});}countDownLatch.await();//所有素材上传成功后入库saveDataBase(map);}catch(InterruptedExceptione){e.printStackTrace();} } newFixedThreadPool 方法用于创建一个固定大小的线程池其中参数指定线程池的大小即线程数量。 适合的线程池大小取决于你的具体需求和应用场景。以下几点是需要考虑的因素 任务的性质 如果你的任务是 CPU 密集型的需要大量的计算和处理那么线程池的大小通常与处理器的核心数相近或略多一些可能是合适的。这样可以充分利用 CPU 资源。如果任务是 I/O 密集型的例如涉及网络请求或文件操作则可能需要更多的线程以充分利用等待 I/O 的时间。可用的系统资源 考虑可用的系统资源包括 CPU 核心数、内存和其他正在运行的应用程序。如果系统资源有限将线程池大小保持在合理的范围内以避免过度消耗资源。任务的数量和规模 考虑任务的数量和规模。如果你预计会有大量的任务需要处理并且这些任务是短暂的那么增加线程池的大小可以提高并发处理能力。但是如果任务的数量较少或任务的执行时间较长可能不需要太多的线程。 需要注意的是如果线程池的大小设置过大可能会导致资源竞争、上下文切换开销增加甚至对系统性能产生负面影响。因此需要根据实际情况进行调整和测试找到适合你应用程序的线程池大小。 综合考虑以上因素你可以根据你的应用需求和性能测试来选择一个合适的线程池大小。通常情况下线程池大小在 2 到 10 之间是一个常见的范围。根据实际情况进行调整和优化是最佳的做法。 CyclicBarrier 用法 从代码使用角度来说 // 初始化值为5的栅栏 CyclicBarrier cyclicBarrier new CyclicBarrier(5); // 每个线程调用 await() cyclicBarrier.await(); // 等到有 5 个线程都执行了 await() 之后继续执行。 // 并且 栅栏的 计数器会自动重置为 5 可以接着用 然后我们模拟一个场景 在游戏中选好英雄之后会等待所有 5 个玩家进度条都到 100% 才开始游戏我们可以使用 CyclicBarrier 来模拟这个场景 publicclassCyclicBarrierTest{privatefinalstaticExecutorServiceEXECUTOR_SERVICEExecutors.newFixedThreadPool(5);privatefinalstaticCyclicBarrierBARRIERnewCyclicBarrier(10);publicstaticvoidmain(String[]args){for(inti0;i5;i){finalStringname玩家i;EXECUTOR_SERVICE.execute(newRunnable(){Overridepublicvoidrun(){try{Thread.sleep(2000);System.out.println(name已准备,等待其他玩家准备...);BARRIER.await();Thread.sleep(1000);System.out.println(name已加入游戏);}catch(InterruptedExceptione){System.out.println(name离开游戏);}catch(BrokenBarrierExceptione){System.out.println(name离开游戏);}}});}EXECUTOR_SERVICE.shutdown();} }
http://www.zqtcl.cn/news/556545/

相关文章:

  • 阿里云建站可不可以备案wordpress评论滑动插件
  • 网站建设教程出售用苏州久远网络现在的网络营销方式
  • 浮动播放器wordpress刷神马seo排名首页排名
  • 建设网站呼叫中心有什么好处站长统计免费下载
  • 做网站电脑配置要求个高吗电子商务网站的建设包含哪些流程图
  • 青岛做网站大公司wordpress文章页加一言
  • 用哪个网站做相册视频文件夹谷歌ads
  • 注册top域名做公司网站男女做暖网站是什么
  • 郴州本地网站建设高端网站设计多少钱
  • 此网站域名即将过期广告制作属于什么行业
  • 牛牛襄阳网站建设wap网站asp源码
  • 信用网站建设招标书建网站需要什么手续
  • 重庆建网站方法网站开发和维护
  • 做网站需要什么人活动策划流程及细节
  • wordpress企业网站seo上海市
  • 北京建外贸网站公司网络域名是什么
  • 聚美优品网站建设方案上市公司的信息网站
  • 济南做网站比较好的公司知道吗为什么做美食视频网站
  • 药店网站源码宣传方式
  • word如何做网站链接淘宝客建站需要多少钱
  • 凡科网免费建站步骤及视频logo设计网页
  • 天梯网站建设软件开发公司职位
  • 建站公司外贸东方购物网上商城
  • 白银做网站企业免费网站模板
  • 网络公司给我们做的网站_但是我们不知道域名是否属于我们湖北正规网站建设质量保障
  • 本地网站asp iis团队展示网站
  • 企业网站管理系统cmswordpress知识管理系统
  • 创建一个网站需要怎么做销售平台公司
  • 网站域名实名认证吗做斗图的网站
  • 公司在兰州要做网站怎样选择做网站数据库表各字段详情