LinkedBlockingQueue的一点理解

本文深入探讨了阻塞队列的工作原理,通过分析LockCondition等底层代码,详细讲解了链表阻塞队列的类继承关系,以及put和take方法的具体实现,帮助读者理解阻塞队列的运行机制。

想要看明白阻塞队列我们首先得对Lock Conditon这些常用的对象有一个底层代码的深刻理解,这样我们理解阻塞队列也就不难。
先来看下链表阻塞对列的类继承关系,对我们理解有一定的帮助。
在这里插入图片描述

一张简图看一下3个往阻塞队列中加元素的区别
在这里插入图片描述
分析一下这个put方法,我们知道这个方法时阻塞的,那具体是怎么阻塞的呢,我们来看一下。
在这里插入图片描述
OK 看完了put方法我们继续了解下take方法
在这里插入图片描述
在这里插入图片描述
分析完了take和put方法 其余的方法我们后续分析

设计线程池的面试回答要点如下: ### 线程池参数理解 - **corePoolSize(核心线程数)**:这是池中保持的线程数,即便线程空闲也不会被销毁。默认情况下核心线程不会被回收,但可通过 `allowCoreThreadTimeOut(true)` 改变这一特性。对于CPU密集型任务,建议设置为CPU核数 + 1;对于IO密集型任务,建议设置为2 * CPU核数 [^1]。 - **maximumPoolSize(最大线程数)**:此为池中允许的最大线程数。只有当工作队列满了,才会创建超过核心线程数的线程。若使用无界队列,该参数实际上不起作用 [^1]。 - **keepAliveTime & unit(存活时间)**:其作用对象是超过核心线程数的线程。还可以通过 `allowCoreThreadTimeOut()` 让核心线程也遵循该存活时间 [^1]。 - **workQueue(工作队列)**:用于存放待执行的任务,不同类型的工作队列会影响线程池的行为。 ### 特殊线程池情况说明 像某些线程池,coreSize 和最大线程数由用户输入,阻塞队列使用 `LinkedBlockingQueue`,线程允许空闲时间为0s。其核心特性是线程数固定,既不会增加也不会减少,线程池也不会自行销毁。由于阻塞队列无限大,不会执行拒绝策略,但可能会堆积无限请求,导致OOM [^2]。 ### 对比不同系统特性(可拓展层面) 可以结合相关概念进行拓展,比如在服务注册方面,Eureka 是 AP 系统强调高可用,Zookeeper 是 CP 系统强调一致性。在网络分区情况下,Eureka 会继续提供服务注册功能,而 Zookeeper 会拒绝写操作,以此说明不同系统设计理念对功能的影响,类比到线程池设计中不同参数设置对线程池功能的影响 [^4]。 ### 任务处理相关设置类比 针对任务处理的反馈机制,可参考生产者的 ack 设置。如 ack 设置为1,leader 收到数据就回应生产者 offset;设置为0容易丢数据;设置为 -1,leader 和 follower 都收到数据才返回消息,效率会慢一点。可思考线程池任务处理过程中是否也有类似不同策略的选择 [^3]。 ```java import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExample { public static void main(String[] args) { int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 60; TimeUnit unit = TimeUnit.SECONDS; LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(); ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue ); // 提交任务 executor.execute(() -> { System.out.println("Task is running."); }); executor.shutdown(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值