1. 线程池
1.1 线程池的线程分配流程

1.2 prestartAllCoreThreads()
初始化线程池时是可以预先创建线程的,初始化线程池后,再调用prestartAllCoreThreads()方法,即可预先创建corePoolSize数量的核心线程。
1.3 prestartCoreThread()
prestartCoreThread()同样可以预先创建线程,只不过该方法只会与创建1条线程
2. 计算线程数量
2.1 推导过程
《Java Concurrency in Practice》中给出过一个公式来估算线程池大小
Ncpu=CPU核心数
Ucpu=CPU使用率,0~1,线程执行时为1
W/C=等待时间与计算时间的比率
2.1 CPU密集型任务
计算密集型任务,可以近似评估为 W=0, 则W/C=0, 这种情况下Ucpu也等于1,所以根据公式可以推导出 Nthreads=Ncpu,但是在实际生产中我们一般会设置为 N + 1,比CPU核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其他原因导致的任务暂停带来的影响。一旦任务暂停,CPU就会处于空闲状态,而这种情况多出来的一个线程就可以充分利用CPU的空闲时间。
2.2 IO密集型任务
如果存在IO的话,W/C >= 1, 根据公式可以推导出 Nthreads >= 2Ncpu, 当然这是一个非常保守的估计,如果有条件可以通过压测来确认出具体的值
