Java多线程(三)——线程池的拒绝策列
上一篇文章我们说了线程池的创建的五种方式,其实五种方法都是在 ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) 方法中填写不同参数而构成的。
其中的参数 handler(拒绝策列)都是默认都是defaultHandler(AbortPolicy),其实还有其他三种拒接策列,下面我介绍一下它们所有的拒接策列的特点。
线程池一共有四种拒接策列:
1、AbortPolicy 只处理自己能处理的最大任务数,其他不能够执行的任务抛弃,并抛出异常。
2、CallerPolicy 不抛弃任务,也不抛出异常,提供一个反馈机制,就是讲任务回退给调用者,从而降低任务的流量。
3、DiscardPolicy 抛弃那些无法执行的任务
4、DiscardOldestPolicy 如果执行程序没有关闭,则工作队列头部的任务被删除,然后重试执行(可能会再次失败,导致重复)。
一、AborPolicy
抛弃那些超过能执行的最大任务数量,(任务数量 = 最大线程数 + 任务队列中等待的数量)。
定义一个最大任务数量为5的线程池,让它执行10个任务。
ps:最大任务数 = maximumPoolSize + 任务等待队列中的容量
执行结果只执行了5个任务,然后就拒接执行后面的任务,抛出异常。
二、CallerPolicy
不会抛弃任务,也不会抛出异常,但是会将完成不了的任务回退给任务的调度者,降低任务的提交流量。
能执行的最大任务数为8,然后让它执行10个任务。
没有抛弃任务,也没有抛出异常,只是将任务回退给任务调度者。
三、DiscardPolicy
抛弃无法执行的任务
最大任务执行数为6,让它执行10个任务数
结果是简单抛弃不能执行的任务。
四、DiscardOldestPolicy
抛弃那些最先加入任务等待队列的任务
最大任务数为5,要执行10任务
结果是抛弃掉那些最先加入到任务等待队列里面的任务
小结一下:
1、AbortPolicy 抛弃不能执行的任务,抛出异常。
2、CallerPolicy 不抛弃任务,不抛出异常,但是会将任务回退给任务调用者,降低任务流量。
3、DiscardPolicy 抛弃不能够执行的任务。
4、DiscardOldestPolicy 抛弃那些最先进入任务等待队列的任务。