首页 > 解决方案 > java-ThreadPool-当线程数小于corePoolSize时,为什么要创建一个新线程而不是使用现有线程?

问题描述

假设在execute()方法中提交了一个新任务,为什么在线程数小于corePoolSize的情况下创建一个新线程而不是使用现有线程?

public static void main(String[] args) {
    ThreadPoolExecutor service = new ThreadPoolExecutor(2, 5, 10L,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(3),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy());
    try {
        for (int i = 0; i < 8; i++) {
            service.execute(() -> {
                System.out.println(Thread.currentThread().getName());
            });
        }
    } finally {
        service.shutdown();
    }
}

我在网上得到了这个问题。这是对的吗?并请告诉我原因。

标签: javamultithreadingthreadpool

解决方案


仅当您了解文档的这一部分时,该问题才有意义:

核心和最大池大小

[...] 当在 method 中提交新任务execute(Runnable)并且运行的线程少于corePoolSize线程时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理请求。[...]

问题是,为什么不使用空闲的工作线程呢?

因为我们不知道是否有任何线程处于空闲状态。

只有线程自己知道这一点,所以我们必须遍历所有线程来检查是否有空闲线程,当我们可以启动一个新线程并使线程池达到其核心大小时,这太昂贵了。

仅供参考:您必须查看源代码才能了解ThreadPoolExecutor这一点。


推荐阅读