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 = 0,maximumPoolSize = Integer.MAX_VALUE以及一个无界队列。
然而在文档中它ThreadPoolExecutor说:
当在方法execute(java.lang.Runnable)中提交新任务并且运行的线程数少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。如果运行的线程数超过 corePoolSize 但少于 maxPoolSize ,则仅当队列已满时才会创建新线程。
那么corePoolSize = 0在这种情况下是如何工作的呢?最初,有 0 个线程,因此尽管文档中没有说明,但我认为它将为提交的第一个任务创建一个新线程。但是,现在我们有 1 个线程 > corePoolSize = 0,并且 1 个线程 < MaximumPoolSize = Integer.MAX_VALUE,根据上面的文档“仅当队列已满时才会创建新线程”,但队列是无界的,所以不会再创建新线程,而我们只能使用 1 个线程?
所以永远不会创建新线程,而我们只能使用 1 个线程?
并不真地。
请注意newCachedThreadPool用途SynchronousQueue:
阻塞队列,其中每个插入操作必须等待另一个线程的相应删除操作,反之亦然。同步队列没有任何内部容量,甚至没有容量 1。
这意味着
如果有空闲工作线程尝试向队列获取任务,则该任务将成功放入队列并立即被该空闲线程获取并执行。
否则,该任务无法放入队列,即队列已满。然后将创建新线程来执行任务