zoukankan      html  css  js  c++  java
  • 架构师养成记--12.Concurrent工具类CyclicBarrier和CountDownLatch

    java.util.concurrent.CyclicBarrier

    一组线程共同等待,直到达到一个公共屏障点。

    举个栗子,百米赛跑中,所有运动员都要等其他运动员都准备好后才能一起跑(假如没有发令员)。

     1 import java.io.IOException;  
     2 import java.util.Random;  
     3 import java.util.concurrent.BrokenBarrierException;  
     4 import java.util.concurrent.CyclicBarrier;  
     5 import java.util.concurrent.ExecutorService;  
     6 import java.util.concurrent.Executors; 
     7 public class UseCyclicBarrier {
     8 
     9     static class Runner implements Runnable {  //远动员,每个运动员都是一个单独的线程
    10         private CyclicBarrier barrier;  //屏障点
    11         private String name;  
    12         
    13         public Runner(CyclicBarrier barrier, String name) {  
    14             this.barrier = barrier;  //每个运动员都要有这个屏障点信息(在这里就表现为:所有人都准备好)
    15             this.name = name;  
    16         }  
    17         @Override  
    18         public void run() {  
    19             try {  
    20                 Thread.sleep(1000 * (new Random()).nextInt(5));  //假设每个运动员都要准备一段时间
    21                 System.out.println(name + " 准备OK.");  
    22                 barrier.await();  //准备好了就等待,等其他人都准备好了
    23             } catch (InterruptedException e) {  
    24                 e.printStackTrace();  
    25             } catch (BrokenBarrierException e) {  
    26                 e.printStackTrace();  
    27             }  
    28             System.out.println(name + " Go!!");  //其他人都准备好了,跑!
    29         }  
    30     } 
    31     
    32     public static void main(String[] args) throws IOException, InterruptedException {  
    33         CyclicBarrier barrier = new CyclicBarrier(3);  // 3 
    34         ExecutorService executor = Executors.newFixedThreadPool(3);  
    35         
    36         executor.submit(new Thread(new Runner(barrier, "zhangsan")));  //zhangsan准备并等待
    37         executor.submit(new Thread(new Runner(barrier, "lisi")));      //lisi准备并等待
    38         executor.submit(new Thread(new Runner(barrier, "wangwu")));    //wangwu准备并等待
    39   
    40         executor.shutdown();  
    41     }  
    42   
    43 }  

    执行结果:

    java.util.Concurrent.CountDownLatch

    t1线程要等待t2和t3线程都准备好了才继续往下执行。

    还是举个栗子,上面的那个栗子中,安排一个发令员,发令员走向场边,下面他应该打响发令枪,但是在这之前,他要确认其他人都准备好了,假设这里的跑步规则是发令员听到所有人都报完名字后才确认所有人都准备好了。

     1 import java.util.concurrent.CountDownLatch;
     2 
     3 public class UseCountDownLatch {
     4 
     5     public static void main(String[] args) {
     6         
     7         final CountDownLatch countDown = new CountDownLatch(2);
     8         
     9         Thread t1 = new Thread(new Runnable() {
    10             @Override
    11             public void run() {
    12                 try {
    13                     System.out.println("进入线程t1" + "等待其他线程处理完成...");
    14                     countDown.await();//计数,计数达到2后继续执行
    15                     System.out.println("t1线程继续执行...");
    16                 } catch (InterruptedException e) {
    17                     e.printStackTrace();
    18                 }
    19             }
    20         },"t1");
    21         
    22         Thread t2 = new Thread(new Runnable() {
    23             @Override
    24             public void run() {
    25                 try {
    26                     System.out.println("t2线程进行初始化操作...");
    27                     Thread.sleep(3000);
    28                     System.out.println("t2线程初始化完毕,通知t1线程继续...");
    29                     countDown.countDown();//报数
    30                 } catch (InterruptedException e) {
    31                     e.printStackTrace();
    32                 }
    33             }
    34         });
    35         Thread t3 = new Thread(new Runnable() {
    36             @Override
    37             public void run() {
    38                 try {
    39                     System.out.println("t3线程进行初始化操作...");
    40                     Thread.sleep(4000);
    41                     System.out.println("t3线程初始化完毕,通知t1线程继续...");
    42                     countDown.countDown();//报数
    43                 } catch (InterruptedException e) {
    44                     e.printStackTrace();
    45                 }
    46             }
    47         });
    48         
    49         t1.start();
    50         t2.start();
    51         t3.start();
    52         
    53         
    54         
    55     }
    56 }

    执行结果:

  • 相关阅读:
    易拓展、易修改的状态流程设计和实现
    消除ifelse/switch语句块来聚合模型的设计与实现
    基于Http协议订阅发布系统设计
    Window mobile 实现CLIST始终选中最新添加数据
    C++ 解压zip利器
    Windows mobile 获取当前路径
    Windows mobile 根据网络地址自动拨号连接GRPS
    Windows mobile设置MFC确认键不退出及OnExit响应退出
    c++使用(Shell32.dll)GetDetailsOf 接口获取文件属性
    C++ 注册表编程
  • 原文地址:https://www.cnblogs.com/sigm/p/6243748.html
Copyright © 2011-2022 走看看