这是正确的吗?
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)
Executors.newFixedThreadPool(numThreads);我正在这样做,因为如果我输入类型,我将访问getActiveCount()和getQueue()方法。Eclipse在这里没有标记任何错误,但是我想确定我所做的是正确的。
实际上,这很奇怪,因为ThreadPoolExecutor implements ExecutorService和我要把ExecutorService投给ThreadPoolExecutor。
发布于 2013-07-26 12:45:57
虽然我通常会同意@Evgeniy,因为他已经说明了原因,但在这个特定的情况下,它实际上是可以的,因为ThreadPoolExecutor的Javadoc特别建议使用工厂方法来创建实例。
我认为这是一项合同义务,即这些方法将返回预期的ThreadPoolExecutor。我不会依赖于查看源代码,因为这可能会随着时间的推移而改变,但是javadoc中的明确建议应该是可靠的。
从javadoc到ThreadPoolExecutor
为了在广泛的上下文中使用,这个类提供了许多可调整的参数和扩展性挂钩。但是,建议程序员使用更方便的执行器工厂方法Executors.newCachedThreadPool() (无界线程池,具有自动线程回收)、Executors.newFixedThreadPool(int) (固定大小线程池)和Executors.newSingleThreadExecutor() (单后台线程),它们为最常见的使用场景预先配置设置。否则,在手动配置和调优该类时,请使用下列指南:
发布于 2013-07-26 12:38:17
我们从执行器源代码中了解到,Executors.newFixedThreadPool返回ThreadPoolExecutor,但Executors没有这么说。因此,从理论上讲,最好直接使用ThreadPoolExecutor创建new实例。
发布于 2013-07-26 12:37:01
您可以查看newFixedThreadPool的源代码,并看到它返回ThreadPoolExecutor,这样转换就不会抛出异常,当然,如果将来有人将更改"newFixedThreadPool“的实现,您的代码可能无法工作。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}https://stackoverflow.com/questions/17881394
复制相似问题