java理解ThreadPoolExecutor中的池大小
我浏览了ThreadPoolExecutor
类的execute
方法。这似乎非常简短和简单:
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
else if (!addIfUnderMaximumPoolSize(command))
reject(command); // is shutdown or saturated
}
}
但是,如果条件poolSize >= corePoolSize
得到满足,似乎什么也不会发生
因为如果OR
条件的第一部分为true,则第二部分将不会执行:
if (true || anyMethodWillNotBeExecuted()) { ... }
根据the rules for thread creation,这里还有maximumPoolSize
。如果线程数等于(或大于)corePoolSize
且小于maxPoolSize
,则应为任务创建新线程或将任务添加到队列中
那么为什么在poolSize
大于或等于corePoolSize
的情况下什么都不应该发生呢
# 1 楼答案
addIfUnderCorePoolSize
将为此执行器创建一个新的“核心”线程。 如果执行器(poolSize
)中的线程数已经大于或等于“核心”线程数(corePoolSize
),则显然不需要创建更多的“核心”线程也许扩展
OR
条件会更清楚一些: