如何解决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();
}
}
我在互联网上遇到了这个问题。这是对的吗?并告诉我原因。
解决方法
仅当您知道documentation的这一部分时,这个问题才有意义:
核心和最大池大小
[...]当在方法
execute(Runnable)
中提交新任务,并且正在运行的线程少于corePoolSize
时,即使创建了其他工作线程,也会创建一个新线程来处理请求闲。 [...]
问题是,为什么不使用空闲的工作线程?
因为我们不知道任何线程是否空闲。
只有线程本身知道这一点,因此我们必须遍历所有线程以检查是否有空闲线程,而当我们只能启动一个新线程并使线程池达到其核心时,这太昂贵了大小。
仅供参考:您必须查看ThreadPoolExecutor
的源代码才能了解这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。