在Java8中,将核心池大小设置为0的有效用例是什么?

在Java8中,将核心池大小设置为0的有效用例是什么?,java,multithreading,Java,Multithreading,我在实践中遵循基于java 5的java并发性,在ThreadPoolExecutor中,当核心池大小设置为0时,任务直接进入队列。Java8的情况并非如此,即使核心池大小设置为0,也会创建一个新线程 所以我的问题是,在一些有效的用例中,在java 8中将核心池大小设置为0是有意义的,还是这样做不再有意义?当核心池为零时,java 5中ThreadPoolExecutor的奇怪行为是一个bug。显然,它在Java6中被悄悄地修复了 事实上,在Java7(根据)中,由于一些修改,这个问题显然再次

我在实践中遵循基于java 5的java并发性,在ThreadPoolExecutor中,当核心池大小设置为0时,任务直接进入队列。Java8的情况并非如此,即使核心池大小设置为0,也会创建一个新线程


所以我的问题是,在一些有效的用例中,在java 8中将核心池大小设置为0是有意义的,还是这样做不再有意义?

当核心池为零时,java 5中
ThreadPoolExecutor
的奇怪行为是一个bug。显然,它在Java6中被悄悄地修复了

事实上,在Java7(根据)中,由于一些修改,这个问题显然再次出现。然后它被确认为一个bug,并被修复

注意,实际上并发性将此描述为“奇怪的行为”,并没有明确建议您在代码中利用它


那么将
corePoolSize
设置为零的实际用例是什么呢

一个这样的用例是按照并发在实践中的建议:

开发人员有时会试图将核心大小设置为零,这样工作线程最终将被拆除,因此不会阻止JVM退出


另外,另一个使用案例是,如果您希望拆除线程以回收资源。。。因为线程池不太可能被长时间使用。

另一个用例是,如果您希望拆除线程以回收资源->这应该通过使用allowCoreThreadTimeOut()来解决。。我们是否特别需要像您提到的那样将其设置为0来处理此条件?提出此问题的原因是,在实践中,我对并发的这一陈述感到困惑“在Java 6中,allowCoreThreadTimeOut允许您请求所有池线程都能够超时;如果您希望有一个具有有界工作队列的有界线程池,但在没有工作要做时仍有所有线程被拆除,请在核心大小为零的情况下启用此功能。“为什么它要求我们同时将corePoolSize设置为0和使用allowCoreThreadTimeOut..难道不应该只使用allowCoreThreadTimeOut就足够了吗?@madcolonel10-假设您使用的是一个修复了错误的Java版本。现在将
corePoolSize
设置为零是实现所需行为的一种方法;i、 e.两个用例。还有另一种方法,但有两种方法做某事并不一定是坏事。请注意,如果(例如)他们禁止将corePoolSize设置为零,正如您所暗示的,这可能会破坏现有代码。。。没有什么好的理由。记住那本教科书已经有15年的历史了,而且已经过时了。它所说的一些东西不再是做事情的最佳方式。