如何合理使用线程池?
2023-04-18 14:05:02 时间
线程池
创建线程池要使用手动方式,自动创建线程使用newFixedThreadPool和newCachedThreadPool可能因为资源耗尽导致OOM问题。
原因:Executors会根据数据量创建固定个数的线程,而Executors.newFixedThreadPool方法会创建一个LinkedBlockingQueue消息队列,查看消息队列的构造方法可以看的是该队列的长度是Integer.MAX_VALUE,可以认为是一个无边界的队列,当数据量较大时(如大量入库操作)且执行较慢时,会导致创建不可控数量的无限队列,导致OOM。
合理使用线程池
- 线程池需根据业务场景做到线程数量、最大线程数、队列长度、拒绝策略可控。
- 线程池需要根据业务场景有不同的名称,以方便排查错误,分析高耗时操作。
所以显然Executors是不符合使用需求且不安全的。
线程池默认工作行为:
- 不会初始化corePoolSize个线程,有任务来了才创建工作线程
- 当核心线程满了之后不会立即扩容线程池,而是把任务堆积到工作队列中
- 当工作队列满了后扩容线程池,一直到线程个数到maximumPoolSize为止
- 如果队列已满且达到最大线程后还有任务进来,按照拒绝策略处理
- 当线程数大于核心线程数时,线程等待KeepAliveTime后还是没有任务需要处理的话,收缩线程到核心线程数
务必清楚线程池本身是不是复用的
线程池的配置:
根据任务的“轻重缓急”来指定线程池的核心参数,包括线程数、回收策略和任务队列
- 对应执行比较慢、数量不大的IO任务,或许要考虑更多的线程数,而不需要太大的队列。
- 而对于吞吐量交大的计算型任务,线程不宜过多,可以是CPU核心数或核心数*2,但可能需要较长的队列来做缓冲。
线程池默认工作行为
- 不会初始化corePoolSize个线程,有任务来了才创建工作线程;
- 当核心线程满了之后不会立即扩容线程池,而是把任务堆积到工作队列中;
- 当工作队列满了后扩容线程池,一直到线程个数到maximumPoolSize为止;
- 如果队列已满且到达最大线程后还有任务进来,则采取拒绝策略;
- 当线程数大于核心线程数时,线程等待
keepAliveTime
后还是没有任务需要处理的话,收缩线程数到核心线程数; - 声明线程池后立即调用prestartAllCoreThreads方法,来启动所有的核心线程;
- 传入true给allowCoreThreadTimeOut方法,来让线程池在空闲的时候同样回收核心线程。
查询线程状态代码
private void printStats(ThreadPoolExecutor threadPool) {
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
log.info("=========================");
log.info("Pool Size: {}", threadPool.getPoolSize());
log.info("Active Threads: {}", threadPool.getActiveCount());
log.info("Number of Tasks Completed: {}", threadPool.getCompletedTaskCount());
log.info("Number of Tasks in Queue: {}", threadPool.getQueue().size());
log.info("=========================");
}, 0, 1, TimeUnit.SECONDS);
}
相关文章
- 提高GIT中代码质量的七点优秀实践
- 构建Kubernetes集群应该有几个?优缺点是什么?
- 微软收购TikTok或面临技术难题:特朗普期限太紧
- 2020年8月编程语言排行榜:C语言第一无悬念,SQL进入前十靠运气?
- DevOps二三事:用持续集成构建自动模型训练系统的理论和实践指南
- Go语言生成二维码是如此简单
- HTTP/3协议的安全优势与挑战
- 上“中台”,是送分,还是送命?
- 公司差点因为代码写得差把我直接给开掉
- Kubernetes架构设计与核心组件工作流
- 你要「老婆」不要?谷歌程序员20行代码把二次元老婆带到现实世界
- 10个很受欢迎的代码编辑器,让开发效率翻倍
- 老板喊你设计一个高效的定时任务系统!
- 快速实施现代化数据架构的五点建议
- 鼠标发明者William English离世,终年 91 岁
- 《三十而已》火爆全网,我分析了21万条弹幕,发现了这些秘密
- 确保Kubernetes安全的三个阶段:构建、部署和运行时!
- GitHub霸榜项目:30万字图解算法题典,超全实用资源,狂揽6000星
- 外媒:TikTok拟开放算法赢得美国监管支持
- 不懂性能测试,被面试官挂了...