CountDownLatch 和 CyclicBarrier

最近无聊(话说刚刚入职就连着加班了2周,然后这周突然很闲,感觉好不可思议)

看了看神往已久的 disruptor,时间比较短,到现在也是不会用,看的云里雾里,习惯性的下载了源码看其中的demo是怎么用的,然后悲剧的发现 demo都看不懂。。悲剧,其中就有上面这两个概念。。。

 

首先说说  CountDownLatch  这 是一个类似信号量的线程计数器(咳咳,说了一句废话),首先看看其中的两个重要的方法,

1.await(), 2.countDown()   对 他就是这么简单。

 初始化一个CountDowLatch,CountDownLatch latch = new CountDownLatch(1)

 

 然后把他们传入需要这些信号来工作的线程,当完成了一项任务,就调用countdown() 方法。其他线程如果必须要等这个线程完成任务才能做事情,那其他线程调用await()方法,等这个线程调用countdown把初始化的数字变成0,然后就会执行。开闸放水了。。

 

在disruptor 中就是利用这个来计算执行的时间,从而计算效率的

 protected long runQueuePass() throws InterruptedException
    {
    	//定义一个CountDownLatch
        final CountDownLatch latch = new CountDownLatch(1);
        //传递给工作线程
        queueProcessor.reset(latch);
        //执行这个线程,返回一个future
        Future<?> future = executor.submit(queueProcessor);
        long start = System.currentTimeMillis();

        //这里往队列里面放数据,然后线程中取 当然这个是反面例子,说明queue没有人家的ringbuffer快
        for (long i = 0; i < ITERATIONS; i++)
        {
            blockingQueue.put(Long.valueOf(i));
        }
//   这里就是等上面的线程执行完成这里才能执行,下面能计算出准确时间
        latch.await();
        long opsPerSecond = (ITERATIONS * 1000L) / (System.currentTimeMillis() - start);
       //停止线程中的计算。
        queueProcessor.halt();
        //future.cancel  发出一个取消线程的信号 关于future 真的并发实战中将的非常明白,
        //可以管理线程生命周期
        future.cancel(true);

        failIf(expectedResult, 0);

        return opsPerSecond;
    }

 

2.CyclicBarrier 类似一个阻塞的线程计数器,大概就是所有拥有这个对象的线程调用CyclicBarrier 的await()方法,然后线程就等待其他线程直到await数目到了你设定的数目,然后就一起开始跑。

在disruptor中,是这样用的

 @Override
    protected long runDisruptorPass() throws Exception
    {
        long expected = ringBuffer.getCursor() + (NUM_PUBLISHERS * ITERATIONS);
        Future<?>[] futures = new Future[NUM_PUBLISHERS];
        for (int i = 0; i < NUM_PUBLISHERS; i++)
        {
        	//这里submit了一个valuePublisher 其中拥有一个cyclicBarrier对象,刚刚开始就调用await方法
        	//阻塞等待
            futures[i] = executor.submit(valuePublishers[i]);
        }

        for (WorkProcessor<ValueEvent> processor : workProcessors)
        {
        	//这里是一个工作线程
            executor.submit(processor);
        }

        long start = System.currentTimeMillis();
        //然后 大喊 开始生产!上面哪两个valuePublisher就开始做数据
        cyclicBarrier.await();

        for (int i = 0; i < NUM_PUBLISHERS; i++)
        {
            futures[i].get();
        }

        while (workSequence.get() < expected)
        {
            LockSupport.parkNanos(1L);
        }

 

 

才疏学浅,以后如果看懂了disruptor怎么用,现在就只能学点旁门左道的东西,等稍微深入点diruptor ,我在贴出来学习学习,感觉他的demo写的太复杂,大神就是大神,根本不给机会让人简单的就使用了。。或者就是。。太笨了我。呵呵呵。

 

顺便吐槽下,真心活干不完呀,无论做的多块,都是一批接着一批,这不是又来了。。唉,怀念以前在上个公司每天大把的时间大把的时间打游戏了 哈哈。。。

你可能感兴趣的:(CountDownLatch)