首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是正确的吗?ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads);

这是正确的吗?ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads);
EN

Stack Overflow用户
提问于 2013-07-26 12:31:41
回答 3查看 1.5K关注 0票数 1

这是正确的吗?

代码语言:javascript
复制
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)          
                                        Executors.newFixedThreadPool(numThreads);

我正在这样做,因为如果我输入类型,我将访问getActiveCount()getQueue()方法。Eclipse在这里没有标记任何错误,但是我想确定我所做的是正确的。

实际上,这很奇怪,因为ThreadPoolExecutor implements ExecutorService和我要把ExecutorService投给ThreadPoolExecutor

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-26 12:45:57

虽然我通常会同意@Evgeniy,因为他已经说明了原因,但在这个特定的情况下,它实际上是可以的,因为ThreadPoolExecutor的Javadoc特别建议使用工厂方法来创建实例。

我认为这是一项合同义务,即这些方法将返回预期的ThreadPoolExecutor。我不会依赖于查看源代码,因为这可能会随着时间的推移而改变,但是javadoc中的明确建议应该是可靠的。

从javadoc到ThreadPoolExecutor

为了在广泛的上下文中使用,这个类提供了许多可调整的参数和扩展性挂钩。但是,建议程序员使用更方便的执行器工厂方法Executors.newCachedThreadPool() (无界线程池,具有自动线程回收)、Executors.newFixedThreadPool(int) (固定大小线程池)和Executors.newSingleThreadExecutor() (单后台线程),它们为最常见的使用场景预先配置设置。否则,在手动配置和调优该类时,请使用下列指南:

票数 4
EN

Stack Overflow用户

发布于 2013-07-26 12:38:17

我们从执行器源代码中了解到,Executors.newFixedThreadPool返回ThreadPoolExecutor,但Executors没有这么说。因此,从理论上讲,最好直接使用ThreadPoolExecutor创建new实例。

票数 2
EN

Stack Overflow用户

发布于 2013-07-26 12:37:01

您可以查看newFixedThreadPool的源代码,并看到它返回ThreadPoolExecutor,这样转换就不会抛出异常,当然,如果将来有人将更改"newFixedThreadPool“的实现,您的代码可能无法工作。

代码语言:javascript
复制
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17881394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档