
java.concurrent
ZzzCrazyPig
让优秀成为一种习惯
展开
-
Guava 对JDK Future异步编程的扩展支持
JDK FutureJDK中Future代表了异步计算的结果,通过向线程池ThreadPoolExecutor(通常使用ExecutorService接口) submit 一个Callable,可返回一个Future, eg:ExecutorService jdkExecutor = Executors.newFixedThreadPool(2);Future<String&g...原创 2018-03-26 09:27:57 · 779 阅读 · 0 评论 -
JUC ExecutorCompletionService 分析
基本介绍ExecutorCompletionService,JUC中提供的CompletionService接口实现,用于实现有限任务的执行以及任务结果的有序返回(先执行完的先被取出)想象这样一种场景,有N个给定的计算任务,每个计算任务耗时各不相同,同时每个计算任务会返回一个结果,应用程序需要做到当每个计算任务完成之后,尽快地对计算结果进行处理(展示,二次处理等等)。假设我们用普通的Thr...原创 2018-07-20 14:59:43 · 664 阅读 · 0 评论 -
JUC ThreadPoolExecutor 分析
基本介绍ThreadPoolExecutor,JUC提供的线程池实现,用于高效执行应用中的多种任务,通过使用多线程并发执行任务,来提高效率;另外相比于自己new Thread去跑任务,使用线程池具有更好的性能,因为线程的创建与销毁需要一定的时间,线程池通过将线程管理起来,new完之后一般不立刻销毁,而是不断地等待处理任务。另外通过线程池来规范线程的使用,可以有效避免滥用线程使用示例...原创 2018-07-14 11:49:46 · 393 阅读 · 0 评论 -
JUC ScheduledThreadPoolExecutor 分析
基本介绍ScheduledThreadPoolExecutor,JUC中提供的调度线程池实现,可以用来执行定时任务,实现与Timer一样的功能特性,相比于Timer,ScheduledThreadPoolExecutor具有以下优势:支持同时调度多种多样的调度任务,耗时的任务调度不会影响其他调度任务的调度(Timer为单线程执行,若存在多个调度任务,则可能任务之间的执行时间会影响到各自的...原创 2018-07-19 13:56:16 · 602 阅读 · 0 评论 -
JUC PriorityBlockingQueue 分析
基本介绍PriorityBlockingQueue JUC中阻塞队列的一种,支持阻塞的优先队列,容量最大可到int的最大值 - 8(Integer.MAX_VALUE - 8),容量可以自动扩展(内部实现)。PriorityBlockingQueue内部使用最小堆的思想来构建,使用数组形式存储元素构造时建议定义好Comparator的实现并传入,在内部实现里面将使用传入的Comparato...原创 2018-07-08 16:28:15 · 380 阅读 · 0 评论 -
JUC SynchronousQueue 分析
基本介绍SynchronousQueue JUC阻塞队列的一种,队列无实际容量,一个put操作必须等待一个take操作的执行,才会解除阻塞状态。将put考虑为生产者的话,需要等待消费者,即take操作来取它的数据,才能够从阻塞等待中返回。数据在SynchronousQueue中是被直接传递的,由put线程传递给take线程使用场景SynchronousQueue的使用场景比较少见,...原创 2018-07-08 12:13:36 · 409 阅读 · 0 评论 -
JUC CyclicBarrier 分析
基本介绍CyclicBarrier可实现多个线程同时等待,达到一个共同临界点,才一起往下执行,并且,可以在达到共同临界点的时候,触发一个action。这个同步组件实现的功能看似与CountDownLatch一样,但是与CountDownLatch只能被使用一次不一样,CyclicBarrier可被重复多次使用。像CountDownLatch、Semaphore、Lock等同步组件,都是通过...原创 2018-06-11 09:22:55 · 311 阅读 · 0 评论 -
JUC Semaphore 分析
基本介绍Semaphore,JUC中提供的一个并发组件,根据字面理解是信号量的意思。Semaphore能够实现的功能是允许多个线程同时获取共享资源,实际是共享锁(基于AQS的共享实现模式)的实现。获取不到资源的线程会进行阻塞等待,直到其他线程释放资源,当前阻塞线程尝试获取共享资源成功,则从阻塞等待中返回,否则继续阻塞等待。每个资源称为一个permit(许可),由Semaphore内部持有。Se...原创 2018-06-10 16:47:29 · 657 阅读 · 0 评论 -
JUC CountDownLatch 分析
简介JUC提供的并发组件CountDownLatch可以实现类似Thread.join的效果,实现等待多个线程执行结束以后才执行接下来逻辑的功能(一个线程阻塞等待其他多个并发任务线程执行完任务之后才解除阻塞)eg:package com.crazypig.juc;import java.util.concurrent.CountDownLatch;public class Co...原创 2018-06-10 16:20:08 · 420 阅读 · 0 评论 -
JUC Atomic原子类分析
基本介绍JUC中atomic子包里面提供了很多Atomic类,用于多线程并发下原子更新(CAS)不同类型对象,主要包括以下几大类:原子更新基本类型类AtomicIntegerAtomicLongAtomicBoolean原子更新数组类型AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray原子更...原创 2018-06-09 23:38:40 · 494 阅读 · 0 评论 -
JUC ReentrantLock 分析
基本介绍ReentrantLock,可重入锁,基于AQS实现的互斥锁,在互斥锁之上支持可重入。可重入的意思是,同一个线程可以多次调用lock方法,而不会导致自己等待自己锁的释放。根据内部实现,分为公平性可重入锁和非公平性可重入锁。由构造函数来指定其公平性,默认使用非公平性实现。ReentrantLock实现了Lock接口,实现的接口如下:public interface Lock {...原创 2018-06-09 14:53:31 · 321 阅读 · 0 评论 -
JUC AbstractQueuedSynchronizer分析
什么是AQSAQS即AbstractQueuedSynchronizer的简称,是实现JUC(java.utils.concurrent包)同步组件的通用基础骨架,JDK中基于此骨架实现的同步组件主要包括ReentrantLock、ReentrantReadWriteLock、CountDownLatch和Semaphore。理解好这个基础骨架实现的功能,就能够更好地去理解其他组件的实现。...原创 2018-06-09 14:35:24 · 321 阅读 · 0 评论 -
JUC DelayQueue 分析
基本介绍DelayQueue,JUC阻塞队列的一种,依赖ReentrantLock(非公平实现)、Condition以及PriorityQueue来实现阻塞等待获取超时元素。队列中的元素需要超时后才能够被取出,若多个线程尝试获取还没有到超时结束的队列首元素,那么这些线程将会挂起等待(依赖Condition await 以及 超时wait)。DelayQueue是阻塞队列中的一种实现,因此它需要...原创 2018-06-13 09:25:15 · 371 阅读 · 0 评论 -
JUC LinkedBlockingQueue 分析
基本介绍JUC里面提供的有界阻塞队列,基于链表方式实现默认队列大小为Integer.MAX_VALUE,给人的感觉是近乎无界,在构造的时候可以自行指定队列的容量内部维护两把锁(putLock与takeLock),用以优化存取的并发性能;put/offer只需要获取putLock,而take/poll只需要获取takeLock,细化了锁粒度,使得存取操作可以并发进行,相比ArrayBloc...原创 2018-06-12 22:41:02 · 301 阅读 · 0 评论 -
JUC ArrayBlockingQueue 分析
先说说BlockingQueueBlockingQueue,JUC中定义的阻塞队列接口,为阻塞队列的实现定义了一些通用的方法,其中包括非阻塞操作以及阻塞操作非阻塞操作: offer,add(add不常用):队列添加元素(队尾添加)poll,remove(remove不常用):移除队列元素(队头移除)阻塞操作: put:队列添加元素,通常在有界队列实现里面,当队列元素个数达到容量...原创 2018-06-11 22:11:08 · 312 阅读 · 0 评论 -
JUC FutureTask 分析
基本介绍FutureTask,JUC中提供的一个Future接口实现类,主要作用是为了支持ThreadPoolExecutor的submit操作。经过前面对JDK线程池的分析JUC ThreadPoolExecutor详解,我们知道在AbstractExecutorService中实现了submit方法,以提交Callable为例:public <T> Future&l...原创 2018-07-15 11:35:33 · 573 阅读 · 0 评论