细数线程池五大坑,一不小心线上就崩了

线程池在优化系统性能时扮演关键角色,但也隐藏着诸多陷阱。本文详细剖析了五个常见问题:1) 拒绝策略不当可能导致系统阻塞;2) 多任务get()异常处理错误;3) ThreadLocal与线程池结合使用时上下文可能丢失;4) 父子任务共用线程池引起死锁。理解并避免这些陷阱对于稳定系统至关重要。
摘要由CSDN通过智能技术生成

系统性能优化的几种常用手段是异步和缓存。因此我们常常使用线程池异步处理一些业务。

线程池的使用还是相对比较简单的,首先创建一个线程池,然后通过execute或submit执行任务。

但魔鬼往往藏于细节之中,稍有不慎就会出错。本文将会详细总结线程池容易出错的五大坑


 

一、拒绝策略参数知多少
二、拒绝策略使用不当,系统阻塞不可用
三、多任务get()异常时,结果获取有误
四、ThreadLocal与线程池搭配使用,上下文缺失
五、父子任务共用同一线程池,系统“饥饿”死锁


 

以下为线程池的核心流程【具体内容参考:线程池原理】

细数线程池五大坑,一不小心线上就崩了


 

一、拒绝策略参数知多少

我们都知道,当任务过多,线程池处理不过来时会被拒绝,进入拒绝策略

public interface RejectedExecutionHandler {
    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}

通过实现RejectedExecutionHandler,就可以作为线程池的拒绝策略使用。
目前官方提供了四种拒绝策略,分别为:

  • CallerRunsPolicy:由任务调用方执行
  • AbortPolicy:抛出异常,同样也是由任务调用方处理异常
  • DiscardPolicy:丢弃当前任务
  • DiscardOldestPolicy:丢弃队列中最老的任务,并执行当前任务

线程池有execute和submit两种方法执行任务:
execute执行我们最原始的任务;
而submit则不同,先是将我们最原始的任务封装成FutureTask任务,然后将FutureTask任务交由execute执行

线程池拒绝策略中Runnable r就是execute执行的任务,因此当使用r时就要注意它是我们最原始的任务还是Future

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值