1. 线程池的执行流程
当任务来了之后,线程池的执行流程是:先判断当前线程数是否大于核心线程数?如果结果为 false,则新建线程并执行任务;如果结果为 true,则判断任务队列是否已满?如果结果为 false,则把任务添加到任务队列中等待线程执行,否则则判断当前线程数量是否超过最大线程数?如果结果为 false,则新建线程执行此任务,否则将执行线程池的拒绝策略。
2 线程池的拒绝策略
当任务过多且线程池的任务队列已满时,此时就会执行线程池的拒绝策略,线程池的拒绝策略默认有以下 4 种:
-
AbortPolicy:中止策略,线程池会抛出异常并中止执行此任务;
-
CallerRunsPolicy:把任务交给添加此任务的(main)线程来执行;
-
DiscardPolicy:忽略此任务,忽略最新的一个任务;
-
DiscardOldestPolicy:忽略最早的任务,最先加入队列的任务。
其中,AbortPolicy,是默认的拒绝策略。