corePoolSize=0 对于 ThreadPoolExecutor 如何工作?

Chi*_*hin 3 java multithreading executorservice blockingqueue threadpoolexecutor

的定义ExecutorService.newCachedThreadPool()

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

它正在创建一个带有 的池corePoolSize = 0maximumPoolSize = Integer.MAX_VALUE以及一个无界队列。

然而在文档中它ThreadPoolExecutor说:

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

那么corePoolSize = 0在这种情况下是如何工作的呢?最初,有 0 个线程,因此尽管文档中没有说明,但我认为它将为提交的第一个任务创建一个新线程。但是,现在我们有 1 个线程 > corePoolSize = 0,并且 1 个线程 < MaximumPoolSize = Integer.MAX_VALUE,根据上面的文档“仅当队列已满时才会创建新线程”,但队列是无界的,所以不会再创建新线程,而我们只能使用 1 个线程?

孙兴斌*_*孙兴斌 5

所以永远不会创建新线程,而我们只能使用 1 个线程?

并不真地。

请注意newCachedThreadPool用途SynchronousQueue

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

这意味着

  • 如果有空闲工作线程尝试向队列获取任务,则该任务将成功放入队列并立即被该空闲线程获取并执行。

  • 否则,该任务无法放入队列,即队列已满。然后将创建新线程来执行任务