Java线程池的队列满了,怎么进行拒绝呢,Java定义了RejectedExecutionHandler接口。一般有5个拒绝策略。
1、AbortPolicy 默认,抛异常
2、DiscardPolicy啥也不做
3、DiscardOldestPolicy丢弃最老的
4、CallerRunsPolicy主线程自己上
5、自定义
/**
*
* <p>Title: RejectedExecutionHandlerImpl</p>
* <p>Description: 拒绝策略</p>
* @author PaoPao
* @date 2018年8月27日
*/
public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler {
private static final Logger LOGGER = Logger.getLogger(RejectedExecutionHandlerImpl.class);
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
LOGGER.info(r.toString());
/**
* AbortPolicy默认策略。使用该策略时,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。
*
*/
// throw new RejectedExecutionException("Task " + r.toString() +
// " rejected from " +
// executor.toString());
/**
* DiscardPolicy是AbortPolicy的silent版本,如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常。
*/
/**
* DiscardOldestPolicy丢弃最老的。也就是说如果队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列。
*/
// if (!executor.isShutdown()) {
// // 移除队头元素
// executor.getQueue().poll();
// // 再尝试入队
// executor.execute(r);
// }
/**
* CallerRunsPolicy加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行。
*/
// if (!executor.isShutdown()) {
// // 直接执行run方法
// r.run();
// }
}
}