- 继承与抽象方法AbstractExecutorService,也就间接实现了ExecutorService、Executor等接口。
构造函数
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;
}
- corePoolSize:
核心线程数量,所谓核心线程就是一直保留在线程池中,即使处于空闲状态也不会销毁线程,除非手动调用allowCoreThreadTimeOut才可以在超时销毁。
- maximumPoolSize:
线程池允许创建的最大线程数量。
- keepAliveTime:
线程池中除了有核心线程之外,还有非核心线程,非核心线程处于空闲的时候会在一定时间范围内被关闭,而这个空闲的时间就是keepAliveTime。
- unit:
keepAliveTime的时间单位,比如秒、分、时等
- workQueue:
保存待执行任务的阻塞队列。如果一个任务进入线程池之后,如果核心线程满了的话,就会先尝试添加到队列中,当然未必添加成功,而且队列也有多种实现,具体的后面再说,先简单理解为排队即可。
- threadFactory:
如果没有设置的话,使用默认的ThreadFactory来创建线程;当然你也可以通过ThreadFactory自己创建线程,比如设置线程名称,优先级等。
- handler:
当达到线程池的最大容量时的拒绝策略。当线程池饱和,继续提交任务,需要一种策略来处理该任务。线程池提供了4种策略:
AbortPolicy:直接抛出异常,这是默认策略;
CallerRunsPolicy:用调用者所在的线程来执行任务;
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;
DiscardPolicy:直接丢弃任务;
网友评论