最近无聊(话说刚刚入职就连着加班了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写的太复杂,大神就是大神,根本不给机会让人简单的就使用了。。或者就是。。太笨了我。呵呵呵。
顺便吐槽下,真心活干不完呀,无论做的多块,都是一批接着一批,这不是又来了。。唉,怀念以前在上个公司每天大把的时间大把的时间打游戏了 哈哈。。。
相关推荐
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...
### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...
在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...
本节主要讲解了Java并发包中线程同步器原理剖析,具体来说是 CountDownLatch 和 CyclicBarrier 的使用和原理剖析。 一、CountDownLatch CountDownLatch 是一个同步工具,它可以让一个线程等待其他线程完成某些操作...
java 高并发应用场景
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...
在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...
Future可以异步获取计算结果,Service用于管理和控制服务的生命周期,而CountDownLatch和CyclicBarrier则有助于协调多个线程间的同步。 在IO操作方面,Guava提供了如Files、ByteStreams、CharStreams等工具类,简化...
CountDownLatch和CyclicBarrier是协调多个线程的工具,前者允许一个或多个线程等待其他线程完成操作,后者允许一组线程等待其他线程到达一个屏障点后一起继续执行。 此外,线程安全的数据结构如ArrayList和Vector、...
此外,Java并发工具类(java.util.concurrent包)提供了许多实用的工具,如ExecutorService、Future、CountDownLatch、CyclicBarrier和ThreadPoolExecutor等。Executor框架简化了线程池的管理和任务调度,而Future...
CountDownLatch和CyclicBarrier则用于协调多个线程间的同步。 最后,Java内存模型(JMM)和线程局部变量(ThreadLocal)也是多线程面试的重要组成部分。JMM规定了线程如何访问共享内存,确保并发环境下的正确性;...
【对线面试官】CountDownLatch和CyclicBarrier 【对线面试官】为什么需要Java内存模型? 【对线面试官】深入浅出Java内存模型 Java虚拟机 【对线面试官】Java从编译到执行,发生了什么? 【对线面试官】双亲委派机制...
CountDownLatch和CyclicBarrier是同步辅助类,用于协调多个线程的执行,而Semaphore用于控制对共享资源的访问数量。 此外,书中还会详细讨论锁和同步机制,如synchronized关键字、volatile变量、读写锁...
Future和Callable接口允许我们定义有返回值的异步任务,而CountDownLatch和CyclicBarrier则是线程同步的工具,用于协调多个线程的启动或等待。 死锁、活锁和饥饿是并发编程中常见的问题。死锁发生于两个或更多线程...