线程池拒绝策略

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 接口

你可能感兴趣的:(线程池拒绝策略)