CountDownLatch和CyclicBarrier使用上的区别

Posted geekdc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CountDownLatch和CyclicBarrier使用上的区别相关的知识,希望对你有一定的参考价值。

一、CountDownLatchDemo

package com.duchong.concurrent;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;

/*
 * CountDownLatch :阻塞主线程,等子线程完成
 */
public class CountDownLatchDemo 


   /**
    * 存放子线程产生的结果
    */
   private static ConcurrentHashMap<String,Integer> resultMap =new ConcurrentHashMap<>();

   public static void main(String[] args) 

      final CountDownLatch latch = new CountDownLatch(5);

      SubThread subThread = new SubThread(latch);

      for (int i = 0; i <=4; i++) 
         new Thread(subThread).start();
      
      try 
         //阻塞主线程
         latch.await();
      
      catch (InterruptedException e) 
      

      //计算总结果
      int sum=0;
      for(Map.Entry<String,Integer> subNumber:resultMap.entrySet())
         sum +=subNumber.getValue();
      
      System.out.println("sum = "+sum);
   


   /**
    * 子线程
    */
   static class SubThread implements Runnable 

      private CountDownLatch latch;

      public SubThread(CountDownLatch latch) 
         this.latch = latch;
      

      @Override
      public void run() 

         String name = Thread.currentThread().getName();
         try 
            int number = RandomUtil.getNumber();
            System.out.println(name+"---number:"+number);
            resultMap.put(name,number);
         
         finally 
            latch.countDown();
         

      

   

技术图片

二、CyclicBarrierDemo

package com.duchong.concurrent;

import java.util.Map;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CyclicBarrier;

/*
 * CyclicBarrier :阻塞子线程,当等待中的子线程数到达一定数量时,跳闸。
 */
public class CyclicBarrierDemo 

    /**
     * 屏障,初始5 当await()的线程数量达到5时,跳闸。
     */
    static CyclicBarrier c = new CyclicBarrier(5,new SumThread());

    /**
     * 存放子线程产生的结果
     */
    private static ConcurrentHashMap<String,Integer> resultMap =new ConcurrentHashMap<>();

    public static void main(String[] args) 

        //模拟四个子线产生随机数值
        for(int i=0;i<=4;i++)
            new Thread(new SubThread()).start();
        
    

    /**
     * 所有子线程等待数等于5时,执行
     */
    private static class SumThread implements Runnable

        @Override
        public void run() 
            int result =0;
            for(Map.Entry<String,Integer> workResult:resultMap.entrySet())
                result = result+workResult.getValue();
            
            System.out.println("result = "+result);
        
    

    /**
     * 子线程
     */
    static class SubThread implements Runnable


        @Override
        public void run() 

            String name = Thread.currentThread().getName();

            int number = RandomUtil.getNumber();
            System.out.println(name+"---number:"+number);

            resultMap.put(name,number);


            try 
                //阻塞子线程
                c.await();
             catch (InterruptedException e) 
                e.printStackTrace();
             catch (BrokenBarrierException e) 
                e.printStackTrace();
            

        
    

技术图片

以上是关于CountDownLatch和CyclicBarrier使用上的区别的主要内容,如果未能解决你的问题,请参考以下文章

AQS原理探究

AQS原理探究

CyclicBarrier和CountDownLatch的差别

基于 AQS 的并发编程: CountDownLatch 和 semaphore

CountDownLatch 和 CyclicBarrier 的基本使用

CountDownLatch CyclicBarrier和Semaphore