【JUC源码解析】CompletableFuture】的更多相关文章

简介 它是一个线程池执行器(ThreadPoolExecutor),在给定的延迟(delay)后执行.在多线程或者对灵活性有要求的环境下,要优于java.util.Timer. 提交的任务在执行之前支持取消,默认情况下,在延迟到来之前,不会自动从队列中删除,但可以设置,使其立刻从队列中移除. 有两种模式,固定频率(scheduleAtFixedRate)和固定延迟(scheduleWithFixedDelay),不管哪种模式,同一个任务不会被叠加执行,即便是不同的线程执行同一个任务. 继承Thr…
简介 SynchronousQueue是一种特殊的阻塞队列,该队列没有容量. [存数据线程]到达队列后,若发现没有[取数据线程]在此等待,则[存数据线程]便入队等待,直到有[取数据线程]来取数据,并释放[存数据线程]: 同理,[取数据线程]到达队列后,若发现没有[存数据线程]在此等待,则[取数据线程]便入队等待,直到有[存数据线程]来存数据,并释放[取数据线程]. 非公平模式,由伪栈实现,TransferStack 公平模式,由伪队列实现,TransferQueue 源码解析 Transfere…
简介 ForkJoin 框架,另一种风格的线程池(相比于ThreadPoolExecutor),采用分治算法,工作密取策略,极大地提高了并行性.对于那种大任务分割小任务的场景(分治)尤其有用. 框架图 几个角色 ForkJoinTask: 有3个实现,分别是RecursiveTask,RecursiveAction,CountedCompleter. RecursiveTask: 可以递归执行的ForkJoinTask. RecursiveAction: 无返回值的RecursiveTask.…
简介 基于优先级队列,以过期时间作为排序的基准,剩余时间最少的元素排在队首.只有过期的元素才能出队,在此之前,线程等待. 源码解析 属性 private final transient ReentrantLock lock = new ReentrantLock(); // 可重入锁 private final PriorityQueue<E> q = new PriorityQueue<E>(); // 优先级队列 private Thread leader = null; //…
简介 CyclicBarrier,一个同步器,允许多个线程相互等待,直到达到一个公共屏障点. 概述 CyclicBarrier支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后,释放所有线程之前,该命令只在屏障点运行一次. 应用 描述 有一个矩阵,每一行数据交给一个线程去处理,处理内容是,将这行数据的每一个值相加,结果存入第一个元素中,每个线程处理完成后,会在屏障点相互等待,直到最后一个线程也到达屏障点,最后将各个线程处理的数据汇总,具体是将每一行汇总的数据(存在每行的第…
简介 ConcurrentLinkedQueue是一个基于链表结点的无界线程安全队列. 概述 队列顺序,为FIFO(first-in-first-out):队首元素,是当前排队时间最长的:队尾元素,当前排队时间最短的.新元素,从队尾插入:检索元素,从队首开始,Node的next属性保证从队首能遍历到所有的有效元素.由于此队列使用Node的next属性联接在一起,因此不允许有null元素. 队列的实现具有非阻塞,弱一致性,滞后更新等特点. 队列维护两个指针,head指针和tail指针,一开始,he…
简介 Exchanger,并发工具类,用于线程间的数据交换. 使用 两个线程,两个缓冲区,一个线程往一个缓冲区里面填数据,另一个线程从另一个缓冲区里面取数据.当填数据的线程将缓冲区填满时,或者取数据的线程将缓冲区里的数据取空时,就主动向对方发起交换缓冲区的动作,而交换的时机是,一个缓冲区满,另一个缓冲区空.代码如下,很简单,没有加注释. public class FillAndEmpty { Exchanger<DataBuffer> exchanger = new Exchanger<…
简介 先说Future, 它用来描述一个异步计算的结果.isDone方法可以用来检查计算是否完成,get方法可以用来获取结果,直到完成前一直阻塞当前线程,cancel方法可以取消任务.而对于结果的获取,只能通过阻塞(get())或者轮询的方式[while(!isDone)]. 阻塞的方式违背了异步编程的理念,轮询的方式耗费无谓的CPU资源(CPU空转).于是,CompletableFuture应运而生. 样例 后面介绍的源码都会以下面的用例为切入点,循着调用轨迹理解源码.如果任务很耗时,记得传E…
功能简介: ArrayBlockingQueue是一种基于数组实现的有界的阻塞队列.队列中的元素遵循先入先出(FIFO)的规则.新元素插入到队列的尾部,从队列头部取出元素. 和普通队列有所不同,该队列支持阻塞操作.比如从空队列中取元素,会导致当前线程阻塞,直到其他线程将元素放入队列:将元素插入已经满的队列,同样会导致当前线程阻塞,直到其他线程从队列中取出元素. ArrayBlockingQueue也支持公平和非公平策略(针对队列中元素的存取线程,也可认为是元素的生产者和消费者). 源码分析: A…
功能简介: LinkedBlockingQueue是一种基于单向链表实现的有界的(可选的,不指定默认int最大值)阻塞队列.队列中的元素遵循先入先出 (FIFO)的规则.新元素插入到队列的尾部,从队列头部取出元素.(在并发程序中,基于链表实现的队列和基于数组实现的队列相比,往往具有更高的吞吐 量,但性能稍差一些) 源码分析: 首先看下LinkedBlockingQueue内部的数据结构: public class LinkedBlockingQueue<E> extends AbstractQ…