线程池拒绝策略

jdk默认提供以下四种线程池拒绝策略

  • AbortPolicy:直接抛出一个RejectedExecutionException异常(默认使用)
    public static class AbortPolicy implements RejectedExecutionHandler {
        /**
         * 构造函数
         */
        public AbortPolicy() { }

        /**
         * 始终抛出RejectedExecutionException
         *
         * @param r 执行的任务
         * @param e 执行器
         */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            throw new RejectedExecutionException("Task " + r.toString() +
                                                 " rejected from " +
                                                 e.toString());
        }
    }
  • CallerRunsPolicy:重试策略,如果线程池未关闭,一直重试
    public static class CallerRunsPolicy implements RejectedExecutionHandler {
        /**
         * 构造函数
         */
        public CallerRunsPolicy() { }

        /**
         * 在执行器的中重试执行任务r,除非执行器已关闭,在这种情况下任务将被丢弃。
         */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                r.run();
            }
        }
    }
  • DiscardOldestPolicy:丢弃最旧的未处理任务
    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
        /**
         * 构造函数
         */
        public DiscardOldestPolicy() { }

        /**
         * 丢弃最旧的未处理任务r
         */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                e.getQueue().poll();
                e.execute(r);
            }
        }
    }
  • DiscardPolicy:直接丢弃当前任务
public static class DiscardPolicy implements RejectedExecutionHandler {
        /**
         * 构造函数
         */
        public DiscardPolicy() { }

        /**
         * 什么事情也不做,直接丢弃任务r
         */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        }
    }

在实际项目中,可根据需求去实现RejectedExecutionHandler 接口

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒...
    颤抖的闪电阅读 38,985评论 4 40
  • 提交一个新的task到线程池后,此时如果ThreadPool内的所有工作线程都在忙碌时(没有可用的线程去处理该ta...
    zcliu阅读 3,790评论 0 1
  • 第一部分 来看一下线程池的框架图,如下: 1、Executor任务提交接口与Executors工具类 Execut...
    压抑的内心阅读 9,736评论 1 24
  • 为什么使用线程池 当我们在使用线程时,如果每次需要一个线程时都去创建一个线程,这样实现起来很简单,但是会有一个问题...
    闽越布衣阅读 9,776评论 10 45
  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 7,713评论 2 20