核心池大小与线程池执行器中的最大池大小
当我们谈论时,核心池大小和最大池大小之间到底有什么区别?
能否借助示例进行解释?ThreadPoolExecutor
当我们谈论时,核心池大小和最大池大小之间到底有什么区别?
能否借助示例进行解释?ThreadPoolExecutor
来自这篇博客文章:
以这个例子为例。起始线程池大小为 1,核心池大小为 5,最大池大小为 10,队列为 100。
当请求传入时,将创建最多 5 个线程,然后将任务添加到队列中,直到达到 100 个。当队列已满时,将创建一个最多为 的新线程。一旦所有线程都在使用中,并且队列已满,任务将被拒绝。随着队列的减少,活动线程的数量也会减少。
maxPoolSize
如果正在运行的线程> corePoolSize & < maxPoolSize,则在“总任务队列已满且新任务队列到达”时,创建一个新线程。
来自 doc: (如果运行的线程数超过 corePoolSize 但小于最大值池大小线程,则仅当队列已满时才会创建新线程。
现在,举一个简单的例子,
ThreadPoolExecutor executorPool = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50));
这里,5是corePoolSize - 意味着Jvm将为前5个任务的新任务创建新线程。其他任务将被添加到队列中,直到队列已满(50 个任务)。
10 是 maxPoolSize - JVM 最多可以创建 10 个线程。意味着如果已经有5个任务/线程正在运行,并且队列中已满50个待处理任务,并且如果队列中还有一个新请求/任务到达,则JVM将创建最多10个新线程(总线程数=以前的5 +新的5);
new ArrayBlockingQueue(50) = 是一个总队列大小 - 它可以在其中对 50 个任务进行排队。
一旦所有10个线程都运行,并且如果新任务到达,那么该新任务将被拒绝。
SUN 在内部创建线程的规则:
如果线程数小于 corePoolSize,请创建一个新线程来运行新任务。
如果线程数等于(或大于)corePoolSize,请将任务放入队列中。
如果队列已满,并且线程数小于 maxPoolSize,请创建一个新线程来运行任务。
如果队列已满,并且线程数大于或等于 maxPoolSize,则拒绝该任务。
希望,这是有帮助的。如果我错了,请纠正我...