线程池的拒绝策略(自定义拒绝策略)

4种拒绝策略

java的线程池目前有4种拒绝策略,如下图:

如果在创建线程池的时候没有指定拒绝策略,默认会采用 AbortPolicy。

    private static final RejectedExecutionHandler defaultHandler =
        new AbortPolicy();

1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略

2. CallerRunsPolicy:只⽤调⽤者所在的线程来处理任务

3. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执⾏当前任务

4. DiscardPolicy:直接丢弃任务,也不抛出异常


 

源码如下,都实现了RejectedExecutionHandler 接口,是策略模式的一种体现。

public static class CallerRunsPolicy implements RejectedExecutionHandler {

    public CallerRunsPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        // 线程池没有被shutdown的情况下  就让caller去 run当前这个任务, 
        //caller 是线程池的调用者
        // 如果线程池被shutdown 了,那么当前任务就会被抛弃。
        if (!e.isShutdown()) {
            r.run();
        }
    }
}


public static class AbortPolicy implements RejectedExecutionHandler {

    public AbortPolicy() { }

    // 直接抛出异常  并且 抛弃任务
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " +
                                             e.toString());
    }
}


public static class DiscardPolicy implements RejectedExecutionHandler {

    public DiscardPolicy() { }

    // 直接抛弃任务 没有任何信息输出
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    }
}



public static class DiscardOldestPolicy implements RejectedExecutionHandler {

    public DiscardOldestPolicy() { }

    // 线程池没有被shutdown的情况下  就抛弃队列中 等的最久的任务(队头),空出位置给当前任务
    //(多线程下有可能失败,会不断的调用相应的拒绝策略直到成功)
    // 如果线程池被shutdown 了,那么当前任务就会被抛弃。
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            e.getQueue().poll();
            e.execute(r);
        }
    }
}

自定义一种拒绝策略

相当于把一个接口组合了进来,我们可以重写该接口的方法,自定义一种拒绝策略。

比如:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

trigger333

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

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

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

打赏作者

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

抵扣说明:

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

余额充值