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

导读:本篇文章讲解 线程池的拒绝策略(自定义拒绝策略),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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);
        }
    }
}

自定义一种拒绝策略

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

比如:

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/92785.html

(0)

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!