Java多线程(三)——线程池的拒绝策列

上一篇文章我们说了线程池的创建的五种方式,其实五种方法都是在 ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) 方法中填写不同参数而构成的。
其中的参数 handler(拒绝策列)都是默认都是defaultHandler(AbortPolicy),其实还有其他三种拒接策列,下面我介绍一下它们所有的拒接策列的特点。

Java多线程(三)——线程池的拒绝策列

线程池一共有四种拒接策列:

1、AbortPolicy 只处理自己能处理的最大任务数,其他不能够执行的任务抛弃,并抛出异常。

2、CallerPolicy 不抛弃任务,也不抛出异常,提供一个反馈机制,就是讲任务回退给调用者,从而降低任务的流量。

3、DiscardPolicy 抛弃那些无法执行的任务

4、DiscardOldestPolicy 如果执行程序没有关闭,则工作队列头部的任务被删除,然后重试执行(可能会再次失败,导致重复)。

一、AborPolicy

抛弃那些超过能执行的最大任务数量,(任务数量 = 最大线程数 + 任务队列中等待的数量)。

Java多线程(三)——线程池的拒绝策列
定义一个最大任务数量为5的线程池,让它执行10个任务。
ps:最大任务数 = maximumPoolSize + 任务等待队列中的容量
Java多线程(三)——线程池的拒绝策列

执行结果只执行了5个任务,然后就拒接执行后面的任务,抛出异常。

Java多线程(三)——线程池的拒绝策列

二、CallerPolicy

不会抛弃任务,也不会抛出异常,但是会将完成不了的任务回退给任务的调度者,降低任务的提交流量。

Java多线程(三)——线程池的拒绝策列

能执行的最大任务数为8,然后让它执行10个任务。

Java多线程(三)——线程池的拒绝策列

没有抛弃任务,也没有抛出异常,只是将任务回退给任务调度者。

Java多线程(三)——线程池的拒绝策列

三、DiscardPolicy

抛弃无法执行的任务

Java多线程(三)——线程池的拒绝策列

最大任务执行数为6,让它执行10个任务数

Java多线程(三)——线程池的拒绝策列

结果是简单抛弃不能执行的任务。

Java多线程(三)——线程池的拒绝策列

四、DiscardOldestPolicy

抛弃那些最先加入任务等待队列的任务

Java多线程(三)——线程池的拒绝策列

最大任务数为5,要执行10任务

Java多线程(三)——线程池的拒绝策列
结果是抛弃掉那些最先加入到任务等待队列里面的任务

Java多线程(三)——线程池的拒绝策列

小结一下:

1、AbortPolicy 抛弃不能执行的任务,抛出异常。

2、CallerPolicy 不抛弃任务,不抛出异常,但是会将任务回退给任务调用者,降低任务流量。

3、DiscardPolicy 抛弃不能够执行的任务。

4、DiscardOldestPolicy 抛弃那些最先进入任务等待队列的任务。