线程池的拒绝策略

目录

前言

一、拒绝策略的执行条件

二、拒绝策略分类

1.AbortPolicy(直接抛出异常)

2.DiscardPolicy(丢弃当前被拒绝的任务,不抛出任何异常)

3.DiscardOldestPolicy(将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务)

4.CallerRunsPolicy(在客户端执行被拒绝的任务)

总结


一、拒绝策略的执行条件

        拒绝策略是在线程池执行任务的过程中使用的,首先我们要了解线程池执行任务的基本过程。每过来一个任务,就会启动一个核心线程去执行它,当核心线程都用完了,再过来任务就会存入到阻塞队列中,当阻塞队列也存满时,会扩充线程池中的线程数,如果线程数达到了最大线程数量时,再过来任务,就会启动拒绝策略。

二、拒绝策略分类

        拒绝策略提供顶级接口 RejectedExecutionHandler ,当执行拒绝策略时,就会调用其中的 rejectedExecution 方法来具体执行拒绝策略。

        关于RejectedExecutionHandler操作说明:当用户提交的任务被拒绝时,线程池所关联的RejectedEcecution方法就会被调用,ThreadPoolExecutor自身提供了几个现成的RejectedExecutorHandler接口的实现类,其中ThreadPoolExecutor.AbortPolicy是线程池使用的默认拒绝策略。如果默认的RejectedExecutionHandler无法满足要求,那么可优先考虑线程池自身提供的其他拒绝策略,其次考虑使用自身实现的RejectedExecutionHandler接口。
jdk默认提供了以下四种拒绝策略:

1.AbortPolicy(直接抛出异常)

          丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。

源码如下:

        

在代码中可见,在rejectedExecution方法中抛出了RejectedExecutionException异常,会对代码的运行进行中止。

2.DiscardPolicy(丢弃当前被拒绝的任务,不抛出任何异常)

源码如下:

        

可以在方法rejectedExecution看到,没有任何的处理异常代码,对任务不做任何处理。

 3.DiscardOldestPolicy(将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务)

        

在rejectedExecution方法中可以看到,用了一个if语句判断,再调用队列的poll方法对队列中最老的任务进行丢弃,再将新的任务放入队列中

 4.CallerRunsPolicy(在客户端线程执行被拒绝的任务)

        

 

直接调用其run方法,对新的任务进行优先执行。

总结

以上就是线程池的几种常见拒绝策略,在具体应用中应该分情况,根据不同需求选择使用哪一种拒绝策略。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值