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

Java线程池的队列满了,怎么进行拒绝呢,Java定义了RejectedExecutionHandler接口。一般有5个拒绝策略。

1、AbortPolicy 默认,抛异常

2、DiscardPolicy啥也不做

3、DiscardOldestPolicy丢弃最老的

4、CallerRunsPolicy主线程自己上

5、自定义

/**
 * 
* 

Title: RejectedExecutionHandlerImpl

*

Description: 拒绝策略

* @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(); // } } }
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

 

你可能感兴趣的:(原创,Java)