码迷,mamicode.com
首页 > 编程语言 > 详细

【Java多线程】CyclicBarrier同步辅助类

时间:2016-06-13 11:51:35      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:java.util.concurrent   cyclicbarrier   同步计数器   

   CyclicBarrier是java.util.concurrent包下的一个同步辅助类,类似于CountDownLatch,也是一个同步计数器。


   与CountDownLatch不同的区别是:
    CountDownLatch的await()方法阻塞的原因是等待调用一定次数的countDown()方法, 可以在同一线程完成;

    CyclicBarrier的await()方法阻塞的原因是等待一定数量的线程调用await()方法, 必须在不同线程调用


   所以,概括来说:

    CountDownLatch是等待一定数量次调用countDown(),否则调用await()方法的线程会阻塞。

    CyclicBarrier 是等待一定数量线程调用await(),否则所有调用await()的线程会阻塞。


   演示代码:

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
  
public class TestCyclicBarrier {  
  
    public static void main(String[] args) {  
      
        ExecutorService exec = Executors.newCachedThreadPool();       
        
        /**
         * 表示必须每5个线程各执行了CyclicBarrier的await()方法, 才会执行CyclicBarrier里的run方法;
         * 如果不足5个线程执行await()方法, 那么执行await()方法的线程将会阻塞, 直到第5个线程执行了await()方法;
         */
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable(){  
            public void run() 
            {  
                System.out.println("大家都到齐了,开始happy去");  
            }
        }); 
        
        final Random random=new Random();
        for(int i = 0; i < 5; i++)
        {
            exec.execute(new Runnable(){  
                public void run() 
                {  
                    try 
                    {  
                        Thread.sleep(random.nextInt(1000));  
                    } 
                    catch (InterruptedException e) 
                    {  
                        e.printStackTrace();  
                    }  
                    System.out.println(Thread.currentThread().getName()+"到了,其他哥们呢");  
                    try 
                    {  
                    	//等待剩余的线程执行await()方法;
                        cyclicBarrier.await();
                    } 
                    catch(InterruptedException e) 
                    {  
                        e.printStackTrace();  
                    } 
                    catch(BrokenBarrierException e) 
                    {  
                        e.printStackTrace();  
                    } 
                    System.out.println(Thread.currentThread().getName()+"说: 人齐了, 打球去吧...");  
                }
            });  
        }  
        exec.shutdown();  
    }  
  
}



   

本文出自 “DeaconLi” 博客,请务必保留此出处http://lizhuquan0769.blog.51cto.com/2591147/1788538

【Java多线程】CyclicBarrier同步辅助类

标签:java.util.concurrent   cyclicbarrier   同步计数器   

原文地址:http://lizhuquan0769.blog.51cto.com/2591147/1788538

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!