ExecutorService.newCachedThreadPool()
的定义是
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
它正在创建一个带有corePoolSize = 0
,maximumPoolSize = Integer.MAX_VALUE
和无限队列的游泳池。
然而在doc的ThreadPoolExecutor
中它说:
当在方法execute(java.lang.Runnable)中提交新任务并且运行的线程少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程。
那么corePoolSize = 0
在这种情况下如何运作?最初,有0个线程,所以虽然它没有在文档中说,我假设它将为提交的第一个任务创建一个新线程。但是,现在我们有1个线程> corePoolSize = 0和1个线程<maximumPoolSize = Integer.MAX_VALUE,根据上面的文档“只有队列满了才会创建新线程”,但队列是无界的,所以没有新的线程会被创建,我们坚持使用1个线程?
所以没有新的线程会被创建,我们被困在1个线程中?
并不是的。
请注意newCachedThreadPool
使用SynchronousQueue
:
一个阻塞队列,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。同步队列没有任何内部容量,甚至没有容量。
这意味着