代码之家  ›  专栏  ›  技术社区  ›  Chin

corePoolSize=0如何适用于ThreadPoolExecutor?

  •  2
  • Chin  · 技术社区  · 6 年前

    的定义 ExecutorService.newCachedThreadPool()

    public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>(),
                                      threadFactory);
    }
    

    它正在创建一个游泳池 corePoolSize = 0 maximumPoolSize = Integer.MAX_VALUE 还有一个无界队列。

    但是在 doc 对于 ThreadPoolExecutor

    在方法execute中提交新任务时(java.lang.Runnable),并且运行的线程少于corePoolSize,则会创建一个新线程来处理该请求,即使其他工作线程处于空闲状态。 如果运行的线程多于corePoolSize,但少于maximumPoolSize,则仅当队列已满时才会创建新线程 .

    那你怎么办 核心池大小=0 在这种情况下工作?最初,有0个线程,所以尽管文档中没有说明,但我假设它将为提交的第一个任务创建一个新线程。但是,现在我们有了1个线程>corePoolSize=0和1个线程<maximumPoolSize=Integer.MAX\u值,根据上面的文档“只有当队列已满时才会创建一个新线程”,但是队列是无限的,所以不会创建新线程,我们只能使用一个线程?

    1 回复  |  直到 6 年前
        1
  •  4
  •   xingbin    6 年前

    所以没有新的线程会被创建,而我们只能使用一个线程?

    不是真的。

    请注意 newCachedThreadPool 使用 SynchronousQueue :

    一种阻塞队列,其中每个插入操作必须等待 另一个线程执行相应的remove操作,反之亦然。A 同步队列没有任何内部容量,甚至没有 一个人的能力。

    • 否则,此任务不能放入队列,换句话说,队列已满。然后将创建新线程来执行任务