ThreadPoolExecutor构造函数的RejectedExecutionHandler handler参数表示当提交的任务数超过maxmumPoolSize与workQueue之和时,任务会交给RejectedExecutionHandler来处理,此处我们来具体了解一下
二、源码分析(1)ThreadPoolExecutor中默认的饱和策略定义如下:
/** * The default rejected execution handler. */ private static final RejectedExecutionHandler defaultHandler = new AbortPolicy();
(2)ThreadPoolExecutor中获取、设置饱和策略的方法如下:
/** * Sets a new handler for unexecutable tasks. * * @param handler the new handler * @throws NullPointerException if handler is null * @see #getRejectedExecutionHandler */ public void setRejectedExecutionHandler(RejectedExecutionHandler handler) { if (handler == null) throw new NullPointerException(); this.handler = handler; } /** * Returns the current handler for unexecutable tasks. * * @return the current handler * @see #setRejectedExecutionHandler(RejectedExecutionHandler) */ public RejectedExecutionHandler getRejectedExecutionHandler() { return handler; }
(3)RejectedExecutionHandler接口
RejectedExecutionHandler的定义如下:
public interface RejectedExecutionHandler{ //被线程池丢弃的线程处理机制 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) ; }
(4)AbortPolicy
此策略继承RejectedExecutionHandler接口,其源码如下:
public static class AbortPolicy implements RejectedExecutionHandler{ public AbortPolicy(){} //直接抛出异常 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { throw new RejectedExecutionException("Task"+r.toString()+"rejected from"+executor.toString()); } }
(5)自定义饱和策略
实现RejectedExecutionHandler接口,代码如下:
package com.test; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; public class RejectedExecutionHandlerDemo implements RejectedExecutionHandler{ @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // TODO Auto-generated method stub System.out.println("线程信息"+r.toString()+"被遗弃的线程池:"+executor.toString()); } }