Executors.newFixedThreadPool 本意是创建一个固定大小的线程池,但这个线程池是什么执行的呢?
1、当一个任务提交执行后,就会先判断是否线程池的数量已经达到上限,如果没有则创建新的线程来执行任务,即使原来创建过的线程是空闲的也不会使用。看源码:
private boolean addIfUnderCorePoolSize(Runnable firstTask) { Thread t = null; final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { if (poolSize < corePoolSize && runState == RUNNING) t = addThread(firstTask); } finally { mainLock.unlock(); } if (t == null) return false; t.start(); return true; }
即只要线程池没有满就会创建新的线程,并不会因为线程池的其他线程是空闲的就不创建新线程