使用Executors创建ScheduledThreadPoolExecutor

时间:2012-04-17 22:37:15

标签: java java.util.concurrent

我非常困惑为什么以下演员不起作用:

ScheduledThreadPoolExecutor timeoutControl = (ScheduledThreadPoolExecutor) Executors.newSingleThreadScheduledExecutor();

ScheduledThreadPoolExecutor实现ScheduledExecutorService。如果我不能将它与实际类一起使用,那么这个Executors调用的重点是什么。

我使用它错了(可能),有人可以提供一些指导吗?

3 个答案:

答案 0 :(得分:4)

您只应将返回的执行者用作ScheduledExecutorService,而不是将其转换为ScheduledThreadPoolExecutor

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

答案 1 :(得分:4)

问题是Executors.newSingleThreadScheduledExecutor();实际上没有返回ScheduledThreadPoolExecutor

Executors班级中的

Source code

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
}

Delegated...类(也有DelegatedExecutorService)只是将所有调用传递给底层执行程序,在这种情况下为ScheduledThreadPoolExecutor。代码中的注释表明这些类的重点是隐藏底层执行器可能具有的所有非接口方法。

无论如何,最好使用界面而不是您正在处理的对象的类版本(List而不是ArrayListScheduledExecutorService而不是{ {1}})。

如果您绝对需要ScheduledThreadPoolExecutor而非ScheduledThreadPoolExecutor中可用的功能,则可以使用ScheduledExecutorService的构造函数来创建它的实例。

答案 2 :(得分:1)

简化:

实现接口的类可以包含接口不具有的其他方法和字段。在这种情况下,该方法返回接口,因此您无法将其向下转换为实现类。