线程池拒绝策略

2020-01-07  本文已影响0人  大山村长

一般在jdk新建线程池的时候,都会配置好几个参数:corePoolSize、  maximumPoolSize、 keepAliveTime、  TimeUnit、BlockingQueue 、 RejectedExecutionHandler; 除了核心线程数、最大线程数、存活时间外,另外两个参数BlockingQueue 、 RejectedExecutionHandler一般的开发工程一般不怎么了解和关注,一般只限于使用。

今天这里就针对RejectedExecutionHandler做一下分享:

在ThreadPoolExecutor类里加入了四个拒绝策略方法,分别是CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy,每一种策略都有特定的使用场景。

CallerRunsPolicy,源码英文注解:

A handler for rejected tasks that runs the rejected task  directly in the calling thread of the {@code execute} method, unless the executor has been shut down, in which case the task is discarded.

就是在当前调用该线程被线程池拒绝后,就会直接在当前线程中调用执行;如果该线程已经关闭,则该线程机会被丢弃。

AbortPolicy。源码注释

该策略,很简单,是构造线程池默认的拒绝策略。当线程池用完后,就会直接丢弃任务,并抛出异常。

DiscardPolicy与AbortPolicy一样,同样是抛弃当前任务线程,但不一样的地方是discardPolicy是静默丢弃,不抛出异常,对于业务时无感知的。

DiscardOldestPolicy与DiscardPolicy同时静默抛弃任务,但是DiscardOldestPolicy是抛弃最先进入队列的任务,并不抛异常,并请求重试,如是,线程已经关闭,则丢弃该任务

上一篇 下一篇

猜你喜欢

热点阅读