创建线程的拒绝策略
创建线程的拒绝策略
对于ThreadPoolExecutor的构造参数,有一个RejectedExecutionHandler参数,用于配置线程池的拒绝策略。
在当前线程阻塞队列已满,工作线程达到最大时,新的线程请求到来就会调用该接口对过量的任务进行处理。
ThreadPoolExecutor默认有四种拒绝策略:
- AbortPolicy
- DiscardPolicy
- DiscardOldestPolicy
- CallerRunsPolicy
AbortPolicy
ThreadPoolExecutor中默认的拒绝策略就是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());
}
}
抛出RejectedExecutionException异常。
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);
}
}
}
CallerRunsPolicy
调用当前线程池的所在的线程去执行被拒绝的任务
public static class CallerRunsPolicy implements RejectedExecutionHandler {
public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
}
缺点就是可能会阻塞主线程,或者说是开辟线程池的线程