外观
如何理解线程池排队与容量限制?
标准回答
ThreadPoolExecutor通常先在核心线程数范围内创建工作线程,达到后尝试入队,队列无法接受时再尝试扩到最大线程数,仍无法处理则执行拒绝策略。使用无界队列时,最大线程数往往不会按想象发挥扩容作用。
无界排队可能造成内存上涨和越来越长的请求等待。有界队列则要求明确过载策略:拒绝、降级、合并重复任务或上游减速。核心UI请求与长时间后台任务不宜无区别混用。
对Android特别注意CallerRunsPolicy:如果提交者是主线程,队列满时它可能在主线程执行重任务,直接造成卡顿。拒绝不等于静默丢任务,应把失败反馈给业务。
追问与回答
为什么任务数不多也会等很久
少量长任务或阻塞I/O占住线程,后面的短关键任务也会排队。记录任务排队时长并考虑任务隔离。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q075