java线程池优化

线程池基础

1 keepAliveTime设置的是超过核心线程池的线程的存活时间。也可以通过allowCorePoolTimeOut(true),使得核心线程池中的线程也超时时间。
2 阻塞队列有三种:同步队列,无界队列,有界队列。
3 rejectedExecutionHandler 有四种:abortPolicy(也是默认方式),CallerRunerPolicy,DiscardPolicy,DiscardOldestPolicy。

线程池优化

非核心线程的创建时机

Java线程池调度策略一直等到任务队列满才开始创建新线程,这个不是我希望看到的。我们希望的是:可以给等待队列设置一个阈值,一旦触及这个阈值马上创建新的线程,防止任务出现过度堆积。

换句话说,未达到阈值时,我们认定核心线程有能力消化全部任务;超过阈值时,我们认定核心线程已经无法满足当前的任务请求现状,必须立即创建新的线程消化当前的任务。另外,这个阈值应当是可配置的。

任务调度策略

采用任务代理类,将任务绑定时机延迟到任务执行时,而非任务添加时。
增加新的任务队列,按添加顺序保存真正的执行任务
运行时,动态从新增任务队列中获取头部任务,做到FIFO。

1 长队列 + 小maximumPoolSize。会减少CPU的使用、操作系统资源、上下文切换的消耗,但是会降低吞吐量,如果任务被频繁的阻塞如IO线程,系统其实可以调度更多的线程。
短队列 + 大maximumPoolSize。CPU更忙,但会增加线程调度的消耗.
总结一下,IO密集型可以考虑多些线程来平衡CPU的使用,CPU密集型可以考虑少些线程减少线程调度的消耗。
2 使用ThreadPoolExecutor来创建线程池,通过这个类需要显示的传入缓存池大小等关键信息,提醒我们注意cpu和内存的消耗。
3 合理设置线程池中的核心线程池,最大线程池等的大小,根据硬件和处理任务的情况作相应的调整
4 管理少量的任务使用同步队列,要求每个任务都要执行且任务量不大则使用无界队列,当任务量很大等其他使用有界队列,防止OOM。
5 最大线程数一般设为2N+1最好,N是CPU核数

Java线程池分析及策略优化
JAVA线程池调优

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值