以上是任务提交后的线程池处理流程。如果想在任务提交前预热线程池,可以使用prestartAllCoreThreads提前创建线程。需要注意的是,上图中两个地方的创建线程都需要加锁。相关代码如下:privatebooleanaddWorker(RunnablefirstTask,booleancore){retry:for(;;){intc=ctl.得到();intrs=runStateOf(c);//仅在必要时检查队列是否为空。如果(rs>=SHUTDOWN&&!(rs==SHUTDOWN&&firstTask==null&&!workQueue.isEmpty()))返回false;对于(;;){intwc=workerCountOf(c);如果(wc>=CAPACITY||wc>=(core?corePoolSize:maximumPoolSize))返回false;如果(compareAndIncrementWorkerCount(c))中断重试;c=ctl.get();//重新读取ctlif(runStateOf(c)!=rs)continueretry;//否则CAS因workerCount更改而失败;重试内循环}}booleanworkerStarted=false;布尔workerAdded=false;工人w=null;try{//这里的内部类Worker继承了AbstractQueuedSynchronizer,也实现了Runnable//Worker中有一个Thread属性,每次创建一个任务都会对应创建一个线程w=newWorker(firstTask);最终线程t=w.thread;if(t!=null){finalReentrantLockmainLock=this.mainLock;//锁定mainLock.lock();try{//持有锁时重新检查。//退出ThreadFactory失败或如果//在获取锁之前关闭。intrs=runStateOf(ctl.get());if(rs
