当线程池被关闭以后,在execute()方法中提交新任务将被拒绝(线程池被关闭或线程数达到maximumPoolSize),此时会采取定义的拒绝策略。在ThreadPoolExecutor中定义了四个静态内部类,均实现了RejectedExecutorService接口,并对接口中的rejectedExecution方法给出具体实现。
一、CallerRunsPolicy
如果线程池没有被关闭,则由提交该任务的线程来执行
public static class CallerRunsPolicy implements RejectedExecutionHandler {
public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
}
二、AbortPolicy
默认的拒绝策略,直接抛出RejectedExecutionException异常。
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());
}
}
三、DiscardPolicy
什么都不做,直接丢弃被拒绝的任务
public static class DiscardPolicy implements RejectedExecutionHandler {
public DiscardPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}
四、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);
}
}
}
本文深入探讨了Java线程池在任务提交过多时的四种拒绝策略:CallerRunsPolicy、AbortPolicy、DiscardPolicy和DiscardOldestPolicy,分别介绍了它们在任务无法执行时的不同处理方式。

被折叠的 条评论
为什么被折叠?



