corePoolSize = 0如何为ThreadPoolExecutor工作?

问题描述 投票:2回答:1

ExecutorService.newCachedThreadPool()的定义是

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>(),
                                  threadFactory);
}

它正在创建一个带有corePoolSize = 0maximumPoolSize = Integer.MAX_VALUE和无限队列的游泳池。

然而在docThreadPoolExecutor中它说:

当在方法execute(java.lang.Runnable)中提交新任务并且运行的线程少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程。

那么corePoolSize = 0在这种情况下如何运作?最初,有0个线程,所以虽然它没有在文档中说,我假设它将为提交的第一个任务创建一个新线程。但是,现在我们有1个线程> corePoolSize = 0和1个线程<maximumPoolSize = Integer.MAX_VALUE,根据上面的文档“只有队列满了才会创建新线程”,但队列是无界的,所以没有新的线程会被创建,我们坚持使用1个线程?

java multithreading executorservice threadpoolexecutor blockingqueue
1个回答
4
投票

所以没有新的线程会被创建,我们被困在1个线程中?

并不是的。

请注意newCachedThreadPool使用SynchronousQueue

一个阻塞队列,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。同步队列没有任何内部容量,甚至没有容量。

这意味着

  • 如果有空闲的工作线程试图获取队列的任务,则该任务将成功放入队列并立即被该空闲线程占用并执行。
  • 否则,此任务无法放入队列,换句话说,队列已满。然后将创建新线程来执行任务
© www.soinside.com 2019 - 2024. All rights reserved.