线程池所需参数
public ThreadPoolExecutor(int corePoolSize,//核心线程线程数
int maximumPoolSize,//最大可创建线程数
long keepAliveTime,//最大线程数据的闲置活跃时间
TimeUnit unit,//闲置活跃时间单位
BlockingQueue<Runnable> workQueue,//存放线程任务的队列、容器
ThreadFactory threadFactory,//创建检查时的工厂方法
RejectedExecutionHandler handler) {//线程池无法消费队列中的任务时,采用什么策略
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
任务阻塞队列BlockingQueue<Runnable> workQueue
- ArrayBlockingQueue (java.util.concurrent)
- 基于数组实现的有界限阻塞队列
- DelayedWorkQueue in ScheduledThreadPoolExecutor (java.util.concurrent)
- 专用延迟队列。为了与TPE声明相匹配、它只能持有RunnableScheduledFutures
- BlockingDeque (java.util.concurrent)//
- 双端队列接口
- SynchronousQueue (java.util.concurrent)
- 同步阻塞队列,可设置公平或者不公平;没有容量限制,插入和删除需要同时执行
- DelayQueue (java.util.concurrent)
- 延迟队列
- LinkedBlockingQueue (java.util.concurrent)
- 基于链表实现的阻塞队列,可以指定容量,如果未指定容量,则容量默认为 Integer.MAX_VALUE。插入操作和删除操作都可能会被阻塞。
- PriorityBlockingQueue (java.util.concurrent)
- 优先级队列
异常触发时需要执行的策略
- RejectedExecutionHandler handler
- 1.提示异常,拒绝执行多余的任务
- new ThreadPoolExecutor.AbortPolicy()
- 2.忽略堵塞队列中最旧的任务
- new ThreadPoolExecutor.DiscardOldestPolicy()
- 3.忽略最新的任务
- new ThreadPoolExecutor.DiscardPolicy()
- 4.使用调用该线程池的线程来run方法执行任务
- new ThreadPoolExecutor.CallerRunsPolicy()
- 5.自定义拒绝策略
- new RejectedExecutionHandler()
线程池执行原理