java.util.concurrent.ThreadPoolExecutor线程池的拒绝策略

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();
//		}

	}
}

猜你喜欢

转载自blog.csdn.net/jellyjiao2008/article/details/82114996