ThreadPool
核心流程
- 入口是
ThreadPoolExecutor#execute
。判断workerCountOf(c) < corePoolSize
,当前对象中的运行的线程数小于核心线程数,新增Worker;如果对象中的运行的线程数大于核心线程数,加入队列中workQueue.offer(command)
;如果队列中加不进去,就执行addWorker(command, false)
。 ThreadPoolExecutor#addWorker
主要就是添加Worker对象,并且启动worker。ThreadPoolExecutor#runWorker
。执行任务。ThreadPoolExecutor#getTask
。主要是从队列中获取任务。如果当前运行的线程数>核心线程数,就执行workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS)
;如果小于等于,则执行workQueue.take();
。核心逻辑,当核心线程获取不到任务,会直接阻塞;当非核心线程获取不到任务,会抛出异常。