Java的线程池主要是指ThreadPoolExcuter类,主要有以下参数:
- corePoolSize:核心线程池大小
- maximumPoolSize: 最大线程池大小
- keepAliveTime: 非核心线程空闲时的存活时间
- workQueue:用来保存等待执行任务的阻塞队列
- threadFactory: 线程工厂,用来创建新的线程
- handler:线程池和阻塞队列满时的拒绝策略
线程池流程:
- 若核心线程池没满,则创建一个核心线程来执行任务
- 若核心线程池已满,则将新任务放进阻塞队列中
- 若核心线程池和阻塞队列均满,则创建非核心线程,从阻塞队列中弹出最前的任务执行
- 若到达最大线程池大小,阻塞队列已满,则执行拒绝策略
拒绝策略有以下几种:
- AbortPolicy:丢弃任务并抛出异常,这是线程池的默认拒绝策略
- DiscardPolicy:丢弃任务,不抛出异常
- DiscardOldestPolicy:抛出队列最前端的旧任务,然后重新提交任务
- CallersRunPolicy:由提交任务的线程处理该任务
Java提供的几种线程池:
- newCatchedThreadPool:用于创建可以无限扩大的线程池
- newFixedSizeThreadPool:创建一个有固定线程数的线程池,采用无界队列
- newSingleThreadPool: 创建一个单线程的线程池
- newScheduledThreadPool: 适用于执行延时或周期性任务