在任务队列长度有限的情况下就会出现拒绝处理新任务的问题,需要有一种策略来处理应该加入任务队列却因为队列已满无法加入的情况。另外在线程池关闭的时候也需要对任务加入队列操作进行额外的协调处理。
接口声明如下:
public interface RejectedExecutionHandler {
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
RejectedExecutionHandler提供了四种方式来处理任务拒绝策略
1、DiscardPolicy
空逻辑,丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
2、DiscardOldestPolicy
丢弃队列最前面的任务,然后重新提交被拒绝的任务。若提交失败则循环直到成功。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
3、AbortPolicy
丢弃任务并抛出RejectedExecutionException异常。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
4、CallerRunsPolicy
由提交任务的线程处理该任务
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
网友评论