1.重要参数:7个
int corePoolSize,//线程池的核心线程数量
int maximumPoolSize,//线程池的最大线程数
long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间
TimeUnit unit,//时间单位
BlockingQueue workQueue,//任务队列,用来储存等待执行任务的队列
ThreadFactory threadFactory,//线程工厂,用来创建线程
RejectedExecutionHandler handler //拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务
拒绝策略包含以下 4 种:
①CallerRunsPolicy:提交任务的线程自己去执行该任务。
②AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException。
③DiscardPolicy:直接丢弃任务,没有任何异常抛出。
④DiscardOldestPolicy:丢弃最老的任务,把最早进入工作队列的任务丢弃,然后把新任务加入到工作队列。
2.实现激进的线程池:
线程池默认的工作方式是:当核心线程满了之后不会立即扩容线程池,而是把任务堆积到工作队列中。当工作队列满了后扩容线程池,一直到线程个数达到 maximumPoolSize 为止。而实现激进的线程池可以通过:先把最大线程数用完,然后再提交任务到队列里面去。
例如 Tomcat线程池的实现思路:
①重写任务队列的 offer 方法。使线程池在提交任务时判断:若当前正在运行的线程数少于最大线程数时,就创建新线程。
②实现一个自定义的拒绝策略处理程序。如果队列满了,则会等待指定时间后再次放入队列。如果再次放入队列的时候还是满的,则抛出拒绝异常。