原理
1.如果线程数小于corePoolSize,新建线程执行提交的任务
2.如果线程数等于corePoolSize,阻塞队列未满,任务提交到阻塞队列,核心线程从阻塞队列获取任务执行
3.如果阻塞队列已满,线程数小于maxNumPoolSize,新建线程执行任务
4.如果线程数等于maxNumPoolSize,新提交的任务通过拒绝策略处理
线程池的状态
RUNNING:接收新任务并处理队列中的任务
SHUTDOWN:处理队列中的任务,不接收新任务
STOP:不接收新任务,不处理队列中的任务,并且会中断在处理的任务(一个任务能不能被中断得看任务本身)
TIDYING:所有任务都终止了,线程池中也没有线程了,达到此状态会调用线程池的terminated()方法
TERMINATED:terminated()方法执行完之后就会转变为TERMINATED
线程池中阻塞队列的作用
1.线程池中的线程执行完创建线程时绑定的第一个任务后,会不断的从队列中获取任务并执行
2.队列中没有任务了,阻塞队列会阻塞尝试获取任务的线程从而维持线程的存活,等队列中有任务后线程就会拿到任务继续执行,通过这种方式维持线程池中指定数量的核心线程
3.某个线程从队列获取任务时,会判断是否使用超时阻塞获取,(非核心线程使用poll,核心线程使用take),非核心线程超时没获取到任务就会自然消亡。