gpt4 book ai didi

java - 除非队列已满,否则固定大小线程池中同时运行的线程数是否总是小于 corePoolSize?

转载 作者:行者123 更新时间:2023-12-01 10:21:14 34 4
gpt4 key购买 nike

javadoc说:

When a new task is submitted [...], and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle. If there are more than corePoolSize but less than maximumPoolSize threads running, a new thread will be created only if the queue is full. By setting corePoolSize and maximumPoolSize the same, you create a fixed-size thread pool. By setting maximumPoolSize to an essentially unbounded value such as Integer.MAX_VALUE, you allow the pool to accommodate an arbitrary number of concurrent tasks.

这是否意味着固定大小线程池中同时运行的线程数将始终小于corePoolSize,除非队列已满?

最佳答案

Does it mean that the count of simultaneously running thread in a fixed-size thread pool will be always less than corePoolSize unless the queue is full?

不,事实并非如此。

语义方法

正如我所读到的,对于固定大小的池,这句话没有说明任何关于 Activity 线程数量的信息,特别是与队列大小相关的信息。将两者联系在一起的唯一一句话是:

If there are more than corePoolSize but less than maximumPoolSize threads running, a new thread will be created only if the queue is full.

这并不适用,因为在固定大小的池中,corePoolSize 等于 maximumPoolSize。 “if”条件永远不会满足。

它确实说明的是:

When a new task is submitted [...], and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle.

只要未达到 corePoolSize 限制,就会创建线程。只要未达到此限制,线程就不会被重用(但它们可能因未捕获的异常或通过池的超时功能而死亡)。如果我们创建足够快或有足够长的队列,这显然为创建 corePoolSize 线程留下了空间。

实验方法

这些知识让我们可以想象这样的场景:创建一个大小为 2 的固定池,其中有一个大小为 5 的等待队列,然后向池中提交两个长时间运行的任务。 (“长时间运行”意味着每个任务的执行时间比主线程提交它们以及线程池确认它们的存在并处理它们所需的时间大一个数量级)。可能的时间表如下:

  1. 主线程将任务 T1 提交到新的空池
  2. 根据上面的引用,corePoolSize 尚未达到,会创建一个新线程来执行 T1。
  3. 线程1开始执行T1
  4. 主线程提交T2
  5. 与第 2 步一样,生成第二个线程,并且池达到 corePoolSize
  6. 与步骤 3 一样,第二个线程开始执行任务 T2

此时,线程池有一个空队列,并且正在运行的线程计数恰好为 corePoolSize,而不是“低于 corePoolSize”,QED。

它的含义:

有点相反,这意味着,获得大于 corePoolSize 的线程数的唯一方法是同时满足所有条件:

  1. 正在运行的线程数大于(或等于)corePoolSize,并且
  2. maximumPoolSize 大于 corePoolSize,并且
  3. 队列已满

关于java - 除非队列已满,否则固定大小线程池中同时运行的线程数是否总是小于 corePoolSize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35602773/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com