【JUC】阻塞队列|DelayQueue延时原理|CompletableFuture异步API大全
大家好我是程序员二叉。简介本篇讲解BlockingQueue阻塞队列核心作用、四大常用队列差异与场景、DelayQueue底层延时实现、CompletableFuture全套高频异步API生产环境高频工具类面试必背。欢迎点赞关注收藏。一、BlockingQueue 阻塞队列核心作用线程安全容器自带锁机制多线程并发put/take无竞态异常双向阻塞能力队列已满生产者调用put()阻塞等待空位队列为空消费者调用take()阻塞等待元素解耦生产者-消费者模型削峰填谷平衡上下游线程执行速度自带批量操作、超时存取、非阻塞存取多种API适配不同业务二、四大主流阻塞队列区别适用场景1. ArrayBlockingQueue底层有界固定数组初始化必须指定容量锁机制全局一把ReentrantLock读写操作互斥不能并行适用流量可控、固定缓冲大小的同步生产消费场景2. LinkedBlockingQueue底层单向链表默认无界可传容量设为有界锁机制生产者、消费者两把独立锁读写可并行吞吐量更高适用高吞吐异步任务、ThreadPoolExecutor线程池默认工作队列3. SynchronousQueue无存储缓冲区不存放任何元素put必须匹配一个take才交付支持公平/非公平模式无容量限制适用瞬时高并发、任务不排队CachedThreadPool底层队列4. DelayQueue无界优先阻塞队列元素必须实现Delayed延时接口只有延时到期的元素才能被take取出适用定时任务、订单超时关闭、会话过期、接口延迟重试三、DelayQueue 底层完整原理内部依托PriorityQueue优先队列按照元素剩余延时时间升序排序队首是最快到期任务全局一把ReentrantLock搭配一个Condition等待队列take()执行流程加锁取出队首延时任务判断延时是否到期到期直接取出返回未到期则await阻塞等待释放锁新延时任务入队会唤醒阻塞线程重新校验队首时间业务元素实现Delayed接口重写getDelay()返回剩余延时毫秒四、CompletableFuture 高频常用API1. 创建异步任务// 无返回值异步CompletableFuture.runAsync(Runnabletask);// 有返回值异步CompletableFuture.supplyAsync(SupplierTtask);2. 完成回调成功 / 失败都会执行whenComplete(BiConsumerT, Throwable)3. 异常单独兜底处理exceptionally(FunctionThrowable,T)异常时返回默认兜底结果4. 串行链式执行thenApply()接收上一步结果转换返回新值thenAccept()消费上一步结果无返回值thenRun()不接收结果单纯执行后续任务5. 多任务组合编排thenCombine()两个任务全部完成合并两者结果applyToEither()两个任务谁先执行完使用最先完成的结果allOf()阻塞等待所有异步任务全部执行完毕anyOf()任意一个任务完成就立刻结束等待6. 阻塞获取结果get()阻塞拿结果抛出受检异常get(long, TimeUnit)带超时阻塞获取join()阻塞拿结果只抛运行时异常无需 try-catch 受检异常面试速记总结阻塞队列平衡生产消费Array固定数组、Linked双锁高吞吐、Synchronous零缓冲DelayQueue基于优先队列排序延时任务到期才可取出CompletableFuture替代原始Future支持链式回调、多任务组合、异常统一处理