1

这个对吗?

ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)          
                                        Executors.newFixedThreadPool(numThreads);

我正在这样做,因为如果我进行类型转换,我将可以访问getActiveCount()getQueue()方法。Eclipse 在这里没有标记任何错误,但我想确保我所做的事情是正确的。

实际上,这很奇怪,因为ThreadPoolExecutor implements ExecutorService我正在ExecutorService投向ThreadPoolExecutor.

4

3 回答 3

4

虽然我通常会同意@Evgeniy 的理由,但在这种特定情况下实际上是可以的,因为 ThreadPoolExecutor 的 Javadoc 特别建议使用工厂方法来创建实例。

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

来自 ThreadPoolExecutor 的 javadoc

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

于 2013-07-26T12:45:57.077 回答
2

我们从 Executors 源代码中知道 Executors.newFixedThreadPool 返回 ThreadPoolExecutor 但 Executors API 并没有这么说。因此理论上最好直接用new.

于 2013-07-26T12:38:17.447 回答
1

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

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
于 2013-07-26T12:37:01.113 回答