线程池技术
Posted bee4j
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池技术相关的知识,希望对你有一定的参考价值。
- 在服务器负载过大,如何让新的线程等待或者友好的拒绝服务?
- 简单方式使用线程池
- 开源技术guava、hystrix
- 线程池的基本作用
- 利用线程池管理并复用线程、控制最大并发数
- 实现任务线程队列缓存策略和拒绝机制
- 实现某些与时间相关的功能
- 定时执行
- 周期执行
- 隔离线程环境
- 比如交易服务和搜索服务在同一台服务器上
- ThreadPoolExecutor核心参数
- corePoolSize
- 常驻核心线程数
- 等于0,任务执行完即销毁
- 大于0,任务执行完,核心线程也不会被销毁
- maximumPoolSize
- 线程池能容纳同时执行的最大线程数
- 如果待执行的线程数大于此值,需要借助workQueue缓存在队列中。
- keepAliveTime
- 线程池中的线程空闲时间
- 空闲线程达到这个值时,线程会被销毁,直到只剩下corePoolSize个线程为止
- 避免浪费内存和句柄资源
- TimeUnit
- 时间单位
- keepAliveTime时间单位通常时秒
- workQueue
- 缓存队列
- 请求线程数大于maximumPoolSize时,线程进入BlockingQueue阻塞队列。是一个生产消费模型队列。
- threadFactory
- 线程工厂,用来生产一组相同任务的线程
- handler
- 执行拒绝策略的对象
- 当超过workQueue的任务缓存区上限后,就可以通过该策略处理请求,这是一种简单的限流保护。
- 三种友好的拒绝策略
- 保存到数据库进行削峰填谷,空闲时再提取出来
- 转向某个提示页面
- 打印日志
- corePoolSize
- Executors的5个核心方法
- newSingleThreadPool
- 保证按任务的提交顺序依次执行
- 无界队列,瞬时请求非常大,会有OOM风险
- 返回ThreadPoolExecutor线程池对象
- newFixedThreadPool
- 核心线程数也是最大可执行线程数
- 不存在空闲线程
- keepAliveTime等于0
- 无界队列,瞬时请求非常大,会有OOM风险
- 返回ThreadPoolExecutor线程池对象
- newCachedThreadPool
- maximumPoolSize最大可以至Integer.MAX_VALUE,如果达到这个上限,没有任何服务器能够正常工作,存在OOM风险。
- 回收工作线程
- 返回ThreadPoolExecutor线程池对象
- newScheduledThreadPool
- 线程数最大可以至Integer.MAX_VALUE,存在OOM风险
- 不回收工作线程
- 返回ScheduledThreadPoolExecutor线程池对象
- newStealingThreadPool
- JDK8引入的新线程池对象
- 支持给定的并行度,默认CPU数量
- 使用多个队列减少竞争
- 返回ForkJoinPool线程池对象
- newSingleThreadPool
- 自定义实现ThreadFactory
- 一定要有特定意义的名称,方便问题回溯
- 如调用来源、线程的业务含义
- 统一用newThread获取线程
- 保存名称前缀+AtomicInteger
- 一定要有特定意义的名称,方便问题回溯
- 自定义实现RejectedExecutionHandler
- 打印当前线程池的状态
- 使用线程池注意事项
- 合理设置线程池参数,根据实际业务场景来决定工作线程数
- 线程资源必须通过线程池提供,不允许在应用中自行显示创建线程
- 不允许使用Executors
- 推荐直接使用ThreadPoolExecutor的方式创建,这样能更加明确线程池的运行规则,避免资源耗尽。
- 创建线程或线程池要指定有意义的名字,方便问题回溯
以上是关于线程池技术的主要内容,如果未能解决你的问题,请参考以下文章