线程池接收到任务时流程图
线程池的四种拒绝策略:AbortPolicy(默认)、DiscardPolicy、DiscardOldestPolicy、CallerRunsPolicy
线程池异常处理的四种方式:
1、任务执行代码中try catch捕获异常;
2、Future对象get方法接收任务执行中抛出的异常;
3、实现接口 AsyncUncaughtExceptionHandler 的 handleUncaughtException 方法;
4、重写 ThreadPoolExecutor 的afterExecute方法
线程池的工作队列:
ArrayBLockingQueue:数组实现的有界队列,FIFO排序
LinkedBlockingQueue:基于链表结构的阻塞队列,容量可设置也可不设置,最大为Integer.MAX_VALUE,FIFO排序,吞吐量高于ArrayBlockingQueue
SynchronousQueue:同步阻塞队列,不存储任何任务,每一个插入操作必须要等前一个任务执行完成,否则将一直处于阻塞状态,吞吐量高于LinkedBlockingQueue;newCacheThreadPool使用
DelayedWorkQueue:任务定时周期的延迟执行队列,根据指定的执行时间从小到大排序,否则根据插入的顺序排序
PriorityBlockingQueue:具有优先级顺序的无界阻塞队列
线程池类型:
newCachedThreadPool:核心线程数为0,最大线程数为Integer.MAX_VALUE,阻塞队列为SynchronousQueue,非核心线程空闲存活时间为60s;适合执行大量短期的小任务
newFixedThreadPool:核心线程数和最大线程数相同,阻塞任务队列为无边界的LinkedBlockingQueue(队列长度一直增加可能导致OOM),因为队列无边界所以不存在非核心线程,非核心线程最长存活时间为0;适合执行长期的任务,CPU密集型任务
newSingleThreadExecutor:核心线程数为1,最大线程数为1,阻塞队列为LinkedBlockingQueue,非核心线程空闲存活时间为0;适合串行执行任务的场景
newScheduleThreadPool:自定义核心线程数,最大线程数为Integer.MAX_VALUE,非核心线程空闲存活时间为0,阻塞队列DelayedWorkQueue,scheduleAtFixedRate() :按某种速率周期执行,scheduleWithFixedDelay():在某个延迟后执行
线程池状态:
RUNNING:接收新任务,处理阻塞队列中的任务
SHUTDOWN:不接收新任务,处理阻塞队列中的任务
STOP:不接收新的业务也不处理阻塞队列中的任务,中断正在执行的任务
TIDYING:所有的任务都已运行中止,记录的任务数为0
TERMINATED:线程池彻底终止