`
zhanghaj00
  • 浏览: 64097 次
社区版块
存档分类
最新评论

CountDownLatch 和 CyclicBarrier

    博客分类:
  • java
 
阅读更多

最近无聊(话说刚刚入职就连着加班了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和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    ### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...

    Java并发编程之美_部分71

    本节主要讲解了Java并发包中线程同步器原理剖析,具体来说是 CountDownLatch 和 CyclicBarrier 的使用和原理剖析。 一、CountDownLatch CountDownLatch 是一个同步工具,它可以让一个线程等待其他线程完成某些操作...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

    Java进阶教程,面试大全,包罗万象

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Java进阶教程,面试大全

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...

    Guava是个风火轮之基础工具(1)Java开发Java经

    Future可以异步获取计算结果,Service用于管理和控制服务的生命周期,而CountDownLatch和CyclicBarrier则有助于协调多个线程间的同步。 在IO操作方面,Guava提供了如Files、ByteStreams、CharStreams等工具类,简化...

    JAVA多线程共13页.pdf.zip

    CountDownLatch和CyclicBarrier是协调多个线程的工具,前者允许一个或多个线程等待其他线程完成操作,后者允许一组线程等待其他线程到达一个屏障点后一起继续执行。 此外,线程安全的数据结构如ArrayList和Vector、...

    java多线程并发实战和源码

    此外,Java并发工具类(java.util.concurrent包)提供了许多实用的工具,如ExecutorService、Future、CountDownLatch、CyclicBarrier和ThreadPoolExecutor等。Executor框架简化了线程池的管理和任务调度,而Future...

    多线程面试59题(含答案)_.zip

    CountDownLatch和CyclicBarrier则用于协调多个线程间的同步。 最后,Java内存模型(JMM)和线程局部变量(ThreadLocal)也是多线程面试的重要组成部分。JMM规定了线程如何访问共享内存,确保并发环境下的正确性;...

    【Java入门知识图谱】帮助Java初学者成长

    【对线面试官】CountDownLatch和CyclicBarrier 【对线面试官】为什么需要Java内存模型? 【对线面试官】深入浅出Java内存模型 Java虚拟机 【对线面试官】Java从编译到执行,发生了什么? 【对线面试官】双亲委派机制...

    java 并发编程实战

    CountDownLatch和CyclicBarrier是同步辅助类,用于协调多个线程的执行,而Semaphore用于控制对共享资源的访问数量。 此外,书中还会详细讨论锁和同步机制,如synchronized关键字、volatile变量、读写锁...

    SAMS Java Thread Programming.zip

    Future和Callable接口允许我们定义有返回值的异步任务,而CountDownLatch和CyclicBarrier则是线程同步的工具,用于协调多个线程的启动或等待。 死锁、活锁和饥饿是并发编程中常见的问题。死锁发生于两个或更多线程...

Global site tag (gtag.js) - Google Analytics