线程池知识点
线程池的执行流程
- 接收到请求后首先判断核心线程有没有满;
- 如果核心线程没满的话,那么就创建一个线程处理请求;
- 如果核心线程满了的话,那么就看看阻塞队列是否已经满了;
- 如果阻塞队列没满的话就加入阻塞队列;
- 如果阻塞队列满了的话就判断最大线程数是否达到;
- 如果最大线程数没有达到的话,就创建一个线程去处理请求;
- 如果最大线程数已经达到的话,就执行拒绝策略;
- 当线程的空闲时间超过了存活时间的话,那么就把空闲线程销毁,保留核心线程数;
合理配置线程池
- CPU密集型,CPU密集型任务配置尽可能少的线程数量:一般公式:CPU核数+1个线程的线程池
- IO密集型,I0密集型时,大部分线程都阻塞,故需要多配置线程数:参考公式:CPU核数11-阻塞系数 阻塞系数在0.8~0.9之间比如8核CPU:8/1-0.9=80个线程数
拒绝策略
- abortpolicy: 这种是直接抛出异常的形式
- discard: 丢弃策略
- discard: 丢弃等待时间最长的请求
- callerruns: 这个是调用者执行策略;
- 也可以自定义拒绝测略
线程池的优势
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性