类图
几种线程池
- 普通线程池
- 定时线程池
线程池构造参数
- corePoolSize: 池中所保存的线程数,包括空闲线程
- maximumPoolSize:池中允许的最大线程数
- keepAliveTime:当线程数大于核心时,此为终止前多余空闲线程等待新任务的最长时间
- unit:keepAliveTime的时间单位
- workQueue:执行前用于保持任务队列
- threadFactory:执行程序创建新线程是所使用工厂
- handler:超出线程容量和队列容量的处理类
线程池运行思路
- 当前池poolSize小于corePoolSize,创建新线程执行任务
- 当前池poolSize大于corePoolSize,且队列未满时,则进入等待队列
- 当前池poolSize大于corePoolSize且小于maximumPoolSize,且等待队列已满时,则创建新线程执行任务
- 当前池poolSize大于corePoolSize且大于maximumPoolSize,且等待队列已满时,则调用拒绝护理器处理
线程池里的每个线程执行 完任务后不会立刻退出,而是会检查下等待队列是否还有任务需要执行,如果在keepAliveTime里等不到新任务,那么退出
拒绝策略
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务