【ThreadPoolExecutor-拒绝策略】

ThreadPoolExecutor 提供了以下四种常见的拒绝策略:

  1. AbortPolicy(抛出异常):

    • 这是默认的拒绝策略。
    • 当任务无法被接收处理时,直接抛出 RejectedExecutionException 异常。
    • 示例:
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, 5, 1, TimeUnit.MINUTES,
            new ArrayBlockingQueue<>(3),
            new ThreadPoolExecutor.AbortPolicy());
    

    当任务提交超过线程池处理能力时,会抛出异常。

  2. CallerRunsPolicy(调用者执行):

    • 当任务无法被接收处理时,由提交任务的线程自己来执行该任务。
    • 示例:
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, 5, 1, TimeUnit.MINUTES,
            new ArrayBlockingQueue<>(3),
            new ThreadPoolExecutor.CallerRunsPolicy());
    

    当任务过多时,提交任务的线程会执行被拒绝的任务。

  3. DiscardOldestPolicy(丢弃最旧任务):

    • 丢弃任务队列中最旧的未处理任务,然后将新任务加入队列。
    • 示例:
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, 5, 1, TimeUnit.MINUTES,
            new ArrayBlockingQueue<>(3),
            new ThreadPoolExecutor.DiscardOldestPolicy());
    

    当新任务无法加入队列时,会丢弃队列头部的任务。

  4. DiscardPolicy(直接丢弃):

    • 直接丢弃新提交的无法处理的任务,不做任何处理。
    • 示例:
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, 5, 1, TimeUnit.MINUTES,
            new ArrayBlockingQueue<>(3),
            new ThreadPoolExecutor.DiscardPolicy());
    

    当无法处理新任务时,直接忽略该任务。

在实际应用中,应根据具体的业务需求选择合适的拒绝策略。如果任务非常重要且不能丢失,可能需要选择 CallerRunsPolicy;如果希望保证线程池的稳定性,避免异常抛出,可以考虑 DiscardOldestPolicyDiscardPolicy

除了上述四种常见的拒绝策略外,还可以自定义拒绝策略来满足特定的需求。

以下是一个简单的自定义拒绝策略示例,假设我们希望在任务被拒绝时将其记录到日志中:

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 记录到日志
        System.out.println("任务被拒绝:" + r.toString());
    }
}

然后在创建 ThreadPoolExecutor 时使用自定义的拒绝策略:

ThreadPoolExecutor executor = new ThreadPoolExecutor(
        2, 5, 1, TimeUnit.MINUTES,
        new ArrayBlockingQueue<>(3),
        new CustomRejectedExecutionHandler());

通过这种方式,可以根据具体的业务逻辑和场景需求来实现个性化的拒绝处理方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值