并发编程--线程池拒绝策略RejectedExecutionHandler(三)

来源:互联网 发布:java需求分析 编辑:程序博客网 时间:2024/05/29 08:22

线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。
当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。

线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy。

ThreadPoolExecutor默认的拒绝策略是AbortPolicy

 private static final RejectedExecutionHandler defaultHandler =        new AbortPolicy();
ThreadPoolExecutor通过regect方法来执行拒绝策略

 final void reject(Runnable command) {        handler.rejectedExecution(command, this);    }
DiscardPolicy:直接丢弃要执行的任务

public static class DiscardPolicy implements RejectedExecutionHandler {                public DiscardPolicy() { }//当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {        }    }
AbortPolicy:直接抛出异常

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());        }    }
CallerRunsPolicy :线程池满则直接执行当前任务

public static class CallerRunsPolicy implements RejectedExecutionHandler {               public CallerRunsPolicy() { }        //如果线程池没有关闭则直接执行线程        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            if (!e.isShutdown()) {                r.run();            }        }    }
DiscardOldestPolicy :当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
public static class DiscardOldestPolicy implements RejectedExecutionHandler {               public DiscardOldestPolicy() { }       //当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            if (!e.isShutdown()) {                e.getQueue().poll();                e.execute(r);            }        }    }

总结:通过模板模式提供RejectedExecutionHandler的不同实现类,这样根据不同的实现类来达到不同的拒绝策略。