拒绝时机
首先,新建线程池时可以指定它的任务拒绝策略,例如:
newThreadPoolExecutor(
5,
10,
5,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务。
第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便 此时可能线程池内部依然有没执行完的任务正在执行,
但是由于线程池已经关闭,此时如果再向线程池内提交任务,就会遭到拒绝。
(线程池已关闭,此时可能线程池内部依然有没执行完的任务正在执行,此时如果再向线程池内提交任务,就会遭到拒绝.)
第二种情况是线程池没有能力继续处理新提交的任务,也就是工作已经非常饱和的时候。
具体讲一下第2种情况,也就是由于工作饱和导致的拒绝。
(由于线程池工作饱和,线程池没有能力继续处理新提交的任务,导致线程池的拒绝。)
比如:新建一个线程池,
使用容量上限为 10 的 ArrayBlockingQueue 作为任务队列,并且指定线程池的核心线程数为 5,最大线程数为 10,
假设此时有 20 个耗时任务被提交,在这种情况下,线程池会首先创建核心数量的线程,
也就是5个线程来执行任务,然后往队列里去放任务,
队列的 10 个容量被放满了之后,会继续创建新线程,直到达到最大线程数 10。