加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

简朴地领略区分CountDownLatch与CyclicBarrier--高并发编程

发布时间:2019-09-16 20:22:33 所属栏目:建站 来源:聚IT
导读:本文首要接头在高并发编程中两很是适用器材CyclicBarrier(同步屏蔽)和CountDownLatch(倒计时锁),两者都是java.util.concurrent并发包内很是有效的并发器材类,为了辅佐领略会团结一些风趣的比喻,下面将对两者举办接头。 一、CountDownLatch倒计时锁(一个

本文首要接头在高并发编程中两很是适用器材CyclicBarrier(同步屏蔽)和CountDownLatch(倒计时锁),两者都是java.util.concurrent并发包内很是有效的并发器材类,为了辅佐领略会团结一些风趣的比喻,下面将对两者举办接头。

编程

一、CountDownLatch倒计时锁(一个线程守候其它N个线程完成某个工作之后才气执行)

  1. //建设一个倒计时锁,配置值为5 
  2.  final CountDownLatch latch = new CountDownLatch(5); 
  3.  try { 
  4.  //启用5个线程 
  5.  for (int i = 1; i <= 5; i++) { 
  6.  new Thread(new Runnable() { 
  7.  @Override 
  8.  public void run() { 
  9.  try { 
  10.  Thread.sleep(1000); 
  11.  } catch (Exception e) { 
  12.  e.printStackTrace(); 
  13.  } 
  14.  System.out.println("子线程执行!"); 
  15.  //让latch锁中的数值减1 
  16.  latch.countDown(); 
  17.  } 
  18.  }).start(); 
  19.  } 
  20.  //处于阻塞状态直到latch中数值为零才执行后续操纵 
  21.  latch.await(); 
  22.  System.out.println("主线程执行"); 
  23.  } catch (Exception e) { 
  24.  System.out.println("捕捉非常"); 
  25.  } 

运行功效:

简朴地领略区分CountDownLatch与CyclicBarrier--高并发编程

理会:倒计时锁领略起来较量轻易,这里通过团结现实场景辅佐领略。场景:一张数据表中存放大量的数据,现要读取内外的全部信息。为了进步读取服从便通过在主线程中开启多个子线程分工相助对数据表举办读取。接下来要守候所有子线程读取完毕之后,将读取到的内容举办汇总并在主线程中举办处理赏罚。

  • 起首先配置一个CountDownLatch倒计时锁 ,并配置倒计时值为5
  • 每一个子线程举办本身的事变,当事变执行完毕完毕后通过执行latch.countDown()对倒计时锁的值举办减1操纵,暗示本身事变完成。
  • 主线程latch.await() 后的代码段一向属于守候状态,直到CountDownLatch的值为0时才继承执行。

简朴地领略区分CountDownLatch与CyclicBarrier--高并发编程

二、可轮回行使的屏蔽CyclicBarrier(N个线程彼此守候,任何一个线程完成之前,全部的线程都必需守候)

  1. //成立一个屏蔽并设定一个值,当有足够的线程到达屏蔽时再一路开释 
  2. CyclicBarrier barrier = new CyclicBarrier(5, () -> { 
  3. System.out.println("开始游戏"); 
  4. }); 
  5. ExecutorService executorPool = Executors.newCachedThreadPool(); 
  6. for (int i = 1; i <= 5; i++) { 
  7. int num = i; 
  8. Thread.sleep(1000); 
  9. executorPool.execute(() -> { 
  10. try { 
  11. System.out.println(num + "号玩家,已筹备好,守候进入游戏"); 
  12. barrier.await(); 
  13. System.out.println(num + "号玩家,已经进入游戏"); 
  14. } catch (InterruptedException e) { 
  15. e.printStackTrace(); 
  16. } catch (BrokenBarrierException e) { 
  17. e.printStackTrace(); 
  18. }); 
  19. executorPool.shutdown(); 

运行功效:

简朴地领略区分CountDownLatch与CyclicBarrier--高并发编程

理会:这里通过一个形象的例子来辅佐领略CyclicBarrier。

  • 一开始成立一个CyclicBarrier工具并配置parties的值为5(领略为开启一个游戏房间,且必要5个玩家都筹备好的前提之后才气开启游戏,各个玩家才气举办游戏嬉戏)。
  • 轮回开启多个线程并各自挪用barrier.await(),领略为玩家别离都进入房间并做好了筹备,线程当挪用barrier.await()要领计数会加1,假如计数还达不到CyclicBarrier预先配置的parties值时则该线程会进入守候状态。
  • 当线程barrier.await()要领计数到达CyclicBarrier预先配置的parties值时,便开始游戏。这个时辰全部的线程(玩家)便同时进入到了游戏中。

简朴地领略区分CountDownLatch与CyclicBarrier--高并发编程

三、两者比拟

简朴地领略区分CountDownLatch与CyclicBarrier--高并发编程

最后

CyclicBarrier(同步屏蔽)和CountDownLatch(倒计时锁)都是不错的高并发编程器材类,两者很相似轻易造成夹杂,通过领略两者各自事变方法和特点并团结营业需求公道地应用他们会有不错的效益。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读