1. AbortPolicy
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
抛出异常表明哪个任务在哪个线程池中执行失败了
2. DiscardOldestPolicy
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
如果线程池不处于shutdown状态(存疑,不处于shutdown状态?还是没有在shutdown过程中?),就把工作队列中的队首元素(最老的任务)移除,然后重新执行threadPoolExecutor的execute方法进行重试。
3. DiscardPolicy
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
什么都不做式拒绝……
4. CallerRunsPolicy
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
如果线程池不处于shutdown状态,就直接调用这个任务的run方法执行这个任务。
5. 自定义线程池拒绝策略
以上4种拒绝策略是ThreadPoolExecutor的静态内部类。
自定义线程池的拒绝策略需要实现RejectedExecutionHandler接口,并重写它的rejectExecution方法,该方法接收两个参数,一个是请求执行的任务,一个是执行该任务的ThreadPoolExecutor。
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);