1.任务提交时,先判断核心线程是否已满,没有满则直接添加到工作线程执行
2.如果核心线程满了,则判断工作队列是否已满,如果没有满,则当前任务存入工作队列
3.如果工作队列也满了,则判断线程是否小于最大线程数,如果小于,那么创建非核心线程执行任务。如果核心或者临时线程执行完任务后,会检查工作队列中是否有需要执行的线程,如果有,则使用非核心线程执行任务
4.如果所有线程都在忙着,则执行拒绝策略。
5.非核心线程空闲时间超过存活时间后,会被销毁
拒绝策略:
1.AbortPolicy:直接抛出异常,默认策略
2.CallerRunsPolicy: 调用者所在的线程来执行任务;
3.DiscardOldestPolicy:丢弃等待最久的任务,执行当前任务
4.DiscardPolicy: 直接丢弃任务
总结:所以线程池的本质是:优先用核心线程,其次排队,再考虑扩容,最后拒绝,这是一个分阶段、有优先级的任务处理策略。