我们首先创建一个线程池
public class ThreadPoolParameters {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(10);
}
}
当然,上面的参数是随便填的,进入 Executors.newFixedThreadPool里面,查看创建 FixedThreadPool线程池的源码,如下就是它源码的一部分
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
我们再进一步进入 ThreadPoolExecutor对象里面,下面是一部分源码
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
我们可以从上面这个线程池中的 this,找到参数最多的创建线程池的代码
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
上面只截取了参数部分代码,下面的实现部分没截取,以下是参数部分
corePoolSize
核心线程数,这是线程空闲时可以保存的线程数,线程池刚创建时,可以指定 corePoolSize的个数,而后线程池可以创建多个线程直到到达 corePoolSize的个数,如果没有特殊设置,corePoolSize线程一创建,就不会主动销毁,即使是在空闲的时间
maximumPoolSize
最大线程数量,指的是一个线程池最多可以创建线程的个数,maximumPoolSize ≥ corePoolSize,当maximumPoolSize 的设置的大于数量 corePoolSize且线程需要创建超出 corePoolSize线程直到 maximumPoolSize个数的话,之后在线程池空闲的时间,线程池会根据 keepAliveTime参数设置的时间销毁多于 corePoolSize个数的线程
keepAliveTime
空闲线程存活时间,当线程池创建的线程数大于 corePoolSize但小于等于maximumPoolSize的时候,只要线程处于空闲的时候,线程池会根据 keepAliveTime设置的时间去销毁多出 corePoolSize个数的线程
unit
线程池设置 keepAliveTime的时间单位,上面的 FixedThreadPool默认的时间单位是 TimeUnit.MILLISECONDS,也就是毫秒级别
workQueue
阻塞队列,存放任务的工作队列,用来存放 corePoolSize处理不过来的任务
threadFactory
线程工厂,用来生产线程以便去处理任务,可以自定义适合业务的线程工厂
handler
任务拒绝策略,用来处理当 workQueue已经满且 maximumPoolSize达到最大上限的时候,用来处理新提交的任务
欢迎大家关注下个人的「公众号」:独醉贪欢