四种线程池拒绝策略

1、AbortPolicy

直接丢弃任务,抛出RejectedExecutionException异常,是默认策略

2、CallerRunsPolicy

只用调用者所在的线程处理任务

3、DiscardOldestPolicy

丢弃等待队列中最旧的任务,并执行当前任务

4、DiscardPolicy

直接丢弃任务,但不抛出异常

### Java 线程池拒绝策略的种类 在 Java 并发编程中,线程池(`ThreadPoolExecutor`)是一个非常重要的工具,它可以有效管理和复用线程,从而提升系统性能。然而,当线程池中的任务队列已满且线程资源耗尽时,线程池会触发拒绝策略(`RejectedExecutionHandler`)。以下是 Java 线程池提供的几种常见的拒绝策略及其特点。 #### 1. **AbortPolicy** 这是 `ThreadPoolExecutor` 默认使用的拒绝策略。如果线程池和任务队列都满了,新的任务将会被丢弃,并抛出一个 `RejectedExecutionException` 异常[^1]。这种策略适用于希望程序严格遵循任务处理规则的场景,任何任务丢失都被视为错误。 #### 2. **CallerRunsPolicy** 在这种策略下,当线程池和任务队列都满了时,新提交的任务不会立即被丢弃,而是由调用线程(即提交任务的那个线程)自行执行这个任务。这种方式可以减缓任务提交的速度,但可能导致主线程阻塞[^2]。 #### 3. **DiscardPolicy** 与 `AbortPolicy` 类似,当线程池和任务队列都满了时,`DiscardPolicy` 会选择默默地丢弃掉无法处理的新任务,而不会抛出任何异常[^2]。这种方法适合那些对任务丢失不敏感的应用场景。 #### 4. **DiscardOldestPolicy** 该策略尝试从任务队列中移除最旧的一个任务,以便为新任务腾出空间。随后再尝试将新任务提交给线程池进行处理。需要注意的是,这一过程可能会重复多次直到成功或者再次失败为止[^2]。 除了上述四种内置的拒绝策略外,开发者还可以通过实现 `RejectedExecutionHandler` 接口来自定义自己的拒绝策略,以满足特定业务需求。 ```java // 自定义拒绝策略示例代码 public class CustomRejectionPolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { System.out.println("Task " + r.toString() + " is rejected."); // 可在此处记录日志、通知管理员或其他补偿措施 } } // 设置自定义拒绝策略线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, new CustomRejectionPolicy() ); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值