zoukankan      html  css  js  c++  java
  • 线程同步辅助类CyclicBarrier

     CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

    集合点同步:CyclicBarrier

    多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才能一起执行下一段任务.

    场景:

    和朋友组队去游玩,再爬山,在吃饭,再KTV

     

    第一个人爬山到顶之后要等待其他的三个人也到顶再下山吃饭,

    第一个人吃完饭之后要等待之后的三个人也吃晚饭,再去KTV

    这四个人相当于四条线程,而这些任务就设定了一一个个的点,这种点称之为集合点.

    CyclicBarrier就是在集合点同步.

    CyclicBarrier和CountDownLatch很相似,但是CyclicBarrier有一个reset能回到初始状态, CountDownLatch不可以.

    还有一个很明显的区别是, CyclicBarrier同一类线程之间相互等待.

    CountDownLatch是其他类线程等待另一类线程来唤醒它们...

     

      CyclicBarrierDemo.java

     1 import java.util.Random;
     2 import java.util.concurrent.BrokenBarrierException;
     3 import java.util.concurrent.CyclicBarrier;
     4 import java.util.concurrent.TimeUnit;
     5 
     6 public class CyclicBarrierDemo {
     7 
     8     public static void main(String[] args) {
     9         final CyclicBarrier cb = new CyclicBarrier(4);
    10         
    11         for (int i = 0; i < 4; i++) {
    12             
    13             new Thread(new Runnable() {
    14                 
    15                 @Override
    16                 public void run() {
    17                     
    18                     try {
    19                         System.out.println(Thread.currentThread().getName()+" :爬山。。。");
    20                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
    21                         System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。");
    22                         cb.await();//await 就是集合点  等待,直到计数器变为0为止
    23                         
    24                         System.out.println(Thread.currentThread().getName()+" :吃饭。。。");
    25                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
    26                         System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。");
    27                         cb.await();//等待,直到计数器变为0为止
    28                         
    29                         System.out.println(Thread.currentThread().getName()+" :KTV。。。");
    30                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
    31                         System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。");
    32                         cb.await();//等待,直到计数器变为0为止
    33                         
    34                         System.out.println(Thread.currentThread().getName()+":回家");
    35                         
    36                     } catch (InterruptedException e) {
    37                         e.printStackTrace();
    38                     } catch (BrokenBarrierException e) {
    39                         e.printStackTrace();
    40                     }
    41                     
    42                 }
    43             }).start();
    44         }
    45         
    46     }
    47 }

     运行结果:

    Thread-0 :爬山。。。
    Thread-2 :爬山。。。
    Thread-1 :爬山。。。
    Thread-3 :爬山。。。
    Thread-2 :到达山顶了。。。
    Thread-1 :到达山顶了。。。
    Thread-0 :到达山顶了。。。
    Thread-3 :到达山顶了。。。
    Thread-3 :吃饭。。。
    Thread-2 :吃饭。。。
    Thread-0 :吃饭。。。
    Thread-1 :吃饭。。。
    Thread-3 :吃完饭了。。。
    Thread-2 :吃完饭了。。。
    Thread-1 :吃完饭了。。。
    Thread-0 :吃完饭了。。。
    Thread-0 :KTV。。。
    Thread-2 :KTV。。。
    Thread-3 :KTV。。。
    Thread-1 :KTV。。。
    Thread-3 :唱完歌了。。。
    Thread-1 :唱完歌了。。。
    Thread-0 :唱完歌了。。。
    Thread-2 :唱完歌了。。。
    Thread-2:回家
    Thread-3:回家
    Thread-1:回家
    Thread-0:回家
  • 相关阅读:
    nginx系列11:负载均衡哈希算法ip_hash与hash模块
    nginx系列10:通过upstream模块选择上游服务器和负载均衡策略round-robin
    nginx系列9:HTTP反向代理请求处理流程
    css 滚动条样式
    Vue优化:常见会导致内存泄漏问题及优化
    vue自定义指令导致的内存泄漏问题解决
    vue动态绑定class的几种方式
    前端知识点回顾之重点篇——CSS中flex布局
    Javascript数组操作
    pc端常用电脑屏幕 ((响应式PC端媒体查询)电脑屏幕分辨率尺寸大全)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6206265.html
Copyright © 2011-2022 走看看