核心池大小与线程池执行器中的最大池大小

2022-08-31 07:46:42

当我们谈论时,核心池大小最大池大小之间到底有什么区别?
能否借助示例进行解释?ThreadPoolExecutor


答案 1

来自这篇博客文章

以这个例子为例。起始线程池大小为 1,核心池大小为 5,最大池大小为 10,队列为 100。

当请求传入时,将创建最多 5 个线程,然后将任务添加到队列中,直到达到 100 个。当队列已满时,将创建一个最多为 的新线程。一旦所有线程都在使用中,并且队列已满,任务将被拒绝。随着队列的减少,活动线程的数量也会减少。maxPoolSize


答案 2

如果正在运行的线程> 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 在内部创建线程的规则:

  1. 如果线程数小于 corePoolSize,请创建一个新线程来运行新任务。

  2. 如果线程数等于(或大于)corePoolSize,请将任务放入队列中。

  3. 如果队列已满,并且线程数小于 maxPoolSize,请创建一个新线程来运行任务。

  4. 如果队列已满,并且线程数大于或等于 maxPoolSize,则拒绝该任务。

希望,这是有帮助的。如果我错了,请纠正我...


推荐