线程饥饿

Reference: https://time.geekbang.org/column/article/85702

 

饥饿:线程因无法访问所需资源而无法执行下去的情况。

 

“不患寡,而患不均”,如果线程优先级“不均”,在CPU繁忙的情况下,优先级低的线程得到执行的机会很小,就可能发生线程“饥饿”;持有锁的线程,如果执行的时间过长,也可能导致“饥饿”问题。

 

解决“饥饿”问题的方案很简单,有三种方案:一是保证资源充足,二是公平地分配资源,三就是避免持有锁的线程长时间执行。这三个方案中,方案一和方案三的适用场景比较有限,因为很多场景下,资源的稀缺性是没办法解决的,持有锁的线程执行的时间也很难缩短。倒是方案二的适用场景相对来说更多一些。

转载于:https://www.cnblogs.com/agilestyle/p/11424747.html

### 线程饥饿的定义及其对 CompletableFuture 性能的影响 #### 1. **线程饥饿的定义** 线程饥饿是指由于系统资源不足或分配不当,导致某些线程无法获得足够的 CPU 时间片或其他必要的计算资源,从而使这些线程长时间处于等待状态的现象[^5]。在线程池中,这种情况通常表现为任务队列过长、线程数不足以满足当前的工作负载需求,或者因为某些任务占用时间过久而导致其他任务迟迟得不到执行机会。 --- #### 2. **线程饥饿与 CompletableFuture 的关系** `CompletableFuture` 是一种强大的异步编程工具,但它依赖底层的线程池来调度和执行任务。如果线程池配置不合理,则可能出现以下几种情况: ##### (1)**共享线程池的风险** 当多个 `CompletableFuture` 实例共用同一个线程池时,任何单一任务的阻塞操作(如 I/O 密集型任务)都会消耗大量线程资源,进而影响到其他非阻塞任务的正常运行[^4]。例如,假设某个 `CompletableFuture` 提交了一组需要等待数据库查询结果的任务,而线程池中的所有可用线程都被这些任务占据,则后续提交的小型计算密集型任务可能会长时间排队甚至超时。 ##### (2)**任务提交数量过多** 如果一次性向线程池提交了大量任务,尤其是那些复杂度较高或存在嵌套调用的任务链,很容易超出线程池的最大容量限制。此时,即使使用了 `CompletableFuture` 的强大功能也无法避免性能下降的问题[^5]。具体来说,任务队列可能会迅速膨胀至极限大小,最终触发拒绝策略(如抛出异常或将多余任务回退到主线程执行),进一步恶化整体效率。 ##### (3)**缺乏有效的超时控制** 尽管 `CompletableFuture` 支持多种组合操作(如 thenApply、thenCompose 等),但如果其中任何一个环节未能按时完成,就可能导致整个链条停滞不前。特别是在没有设定合理超时的情况下,受影响的部分不仅限于当前任务本身,还波及其他关联任务[^5]。 --- #### 3. **解决线程饥饿问题的具体措施** ##### (1)**分离业务场景下的线程池** 针对不同类型的作业(CPU 密集型 vs I/O 密集型),应该分别创建独立的线程池,并为其分配恰当的核心线程数和最大线程数。这样做能够有效缓解资源争抢局面,确保每种类型的任务都能得到公平对待。 ```java // 自定义线程池示例 ExecutorService cpuBoundPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); ExecutorService ioBoundPool = Executors.newCachedThreadPool(); ``` ##### (2)**实施批量提交策略** 为了避免短时间内涌入太多请求造成冲击,可以考虑将大规模任务分解成若干个小批次逐一处理。这种方法既减轻了线程池的压力,又提高了系统的稳定性和可维护性[^5]。 ##### (3)**引入动态调整机制** 通过实时监控线程池的状态数据(如活跃线程计数、队列长度等),适时修改其配置参数以适应变化着的工作负荷。现代框架和技术栈往往提供了这样的灵活性,允许管理员依据实际需求灵活增减资源配额。 --- ### 结论 综上所述,线程饥饿是一种常见的并发编程难题,尤其在涉及 `CompletableFuture` 这样的高级特性时显得尤为重要。只有充分理解背后原理并采取针对性预防手段,才能最大限度发挥其潜力而不至于陷入性能泥潭之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值