一般在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是抛弃最先进入队列的任务,并不抛异常,并请求重试,如是,线程已经关闭,则丢弃该任务
网友评论