java线程池当线程数量小于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();
}
}

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

只有当您知道文档的这一部分时,这个问题才有意义:

核心和最大池大小

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

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

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

只有线程本身知道这一点,所以我们必须对所有线程进行迭代,以检查是否有空闲线程,而当我们只能启动一个新线程并使线程池达到其核心大小时,这太昂贵了。

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

最新更新