为什么要使用线程池?
1.降低资源消耗
2.提高响应速度
3.提高线程的可管理性(线程监控)
线程池核心参数
corePoolSize -- 核心线程数
maximumPoolSize -- 线程不够用时能够创建的最大线程数
workQueue -- 任务等待队列
keepAliveTime -- 当线程数量大于核心线程数时,此时又是空闲的,则过此设置时间,线程销毁
threadFactory -- 用于创建新线程
handler -- 线程饱和策略
线程池的几种拒绝策略
AbortPolicy -- 直接抛出异常(默认策略)
CallerRunsPolicy -- 用调用者所在的线程来执行任务
DiscardOldestPolicy -- 丢弃队列中最靠前的任务,并执行当前任务
DiscardPolicy -- 直接丢弃任务
execute()和submit()的区别
void execute(Runnable command);
<T> Future<T> submit(Runnable task, T result);
从上面就能很直观的看出,execute适用于没有返回值的任务,而submit适用于有返回值的任务
线程池工作的具体流程
--shutdown-->SHUTDOWN --阻塞队列为空,线程池工作数量为0 --
RUNNING - --> TIDYING --terminated() --> TERMINATED
--shutdownnow-->STOP --线程池中工作线程数量为0 ----------