带着实际的使用案例来分析源码可以很大的提升效率。本次分析在使用Executors.newFixedThreadPool创建线程池时,内部的代码逻辑执行情况。废话补多说,上代码
本次案例创建了一个固定线程大小为5的线程池,并且为它添加了20个任务,随后进行了关闭操作。我们先来看看newFixedThreadPool方法
再结合ThreadPoolExecutor构造方法看一下
this里的代码
我们可以看到,corePoolSize核心线程数和maximumPoolSize最大线程数是相等的,在本次案例中值全为5。
keepAliveTime值为0,使用无界的阻塞队列LinkedBlockingQueue(最大值为Integer.MAX_VALUE),并且对各个参数进行了验证。
接下来看一下,线程池用到的默认线程工厂
这个默认的线程工厂类还是比较简单的,在创建线程的时候只是用new Thread创建新的线程,并将创建的线程放到了同一个线程组里,为线程命名,设置为非守护线程(可以简单理解为main线程执行完,仍可以继续执行的线程)。
到这一步newFixedThreadPool相关的代码就看完了,我们发现,在创建完线程池后,并没有立马去创建5个线程,只是把线程工厂赋值给了线程池。那是在什么时候创建的线程呢?我们接着看下execute方法