zoukankan      html  css  js  c++  java
  • 秒杀多线程之CyclicBarrier

    CyclicBarrier是用来一个关卡来阻挡住所有线程,等所有线程全部执行到关卡处时,再统一执行下一步操作。

    package com.multithread.cyclicbarrier;
    
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    import com.multithread.main.ExampleInterface;
    
    public class CyclicBarrierExample extends ExampleInterface {
    
        @Override
        public void startDemo() {
             System.out.println("开始线程:"+Thread.currentThread().getId());
            // TODO Auto-generated method stub
            final CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
    
                /*
                 * 运行在最后一个await到达的线程,不是主线程!
                 * */
                @Override
                public void run() {
                    System.out.println("所有选手ready"+"线程:"+Thread.currentThread().getId());
                }
            });
            
            ExecutorService executor = Executors.newFixedThreadPool(3); 
            executor.submit(new Thread(new Runner(barrier, "1号选手")));  
            executor.submit(new Thread(new Runner(barrier, "2号选手")));  
            executor.submit(new Thread(new Runner(barrier, "3号选手")));  
      
            executor.shutdown();
        }
    
    }
    
    package com.multithread.cyclicbarrier;
    
    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    public class Runner implements Runnable {
    
         // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)  
        private CyclicBarrier barrier;  
      
        private String name;  
      
        public Runner(CyclicBarrier barrier, String name) {  
            super();  
            this.barrier = barrier;  
            this.name = name;  
        }  
      
        @Override  
        public void run() {  
            try {  
                Thread.sleep(1000 * (new Random()).nextInt(8));  
                System.out.println(name + " 准备好了..."+"线程:"+Thread.currentThread().getId());  
                // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。  
                barrier.await();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            } catch (BrokenBarrierException e) {  
                e.printStackTrace();  
            }  
            System.out.println(name + " 起跑!"+"线程:"+Thread.currentThread().getId());  
        }  
    }

    运行结果:

    开始线程:1
    3号选手 准备好了...线程:14
    1号选手 准备好了...线程:10
    2号选手 准备好了...线程:12
    所有选手ready线程:12
    2号选手 起跑!线程:12
    3号选手 起跑!线程:14
    1号选手 起跑!线程:10

    CountDownLunch,SemaPhone,CyclicBarrier的异同。

    CountDownLunch 可理解为减速器。首先设置一个值,每个线程countdown一下,知道最终为0.这个时候主线程中await函数会启动。

    Semaphore 是一种资源,当开始设置一个资源总量,当需要时acquire,资源都在被使用的时候,线程会等待,知道有线程release资源。

    CyclicBarrier是计数器,每个子线程await来阻塞线程,当子线程await的个数,达到设置的值时,每个线程都可以继续执行。

    就像比赛选手等待。

  • 相关阅读:
    SP1716 GSS3
    A Simple Problem with Integers题解
    P4528 [CTSC2008]图腾 题解
    P1498 南蛮图腾 题解
    P2024 [NOI2001]食物链 题解
    Windows编程 Windows程序的生与死(中)
    Windows编程 Windows程序的生与死(上)
    C#实现在注册表中保存信息
    沿路径动画(Animation Along a Path)
    倾斜动画(SkewTransform)
  • 原文地址:https://www.cnblogs.com/deman/p/4076787.html
Copyright © 2011-2022 走看看