【问题标题】:Creating ScheduledThreadPoolExecutor Using Executors使用 Executor 创建 ScheduledThreadPoolExecutor
【发布时间】:2012-04-17 22:37:14
【问题描述】:

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

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

ScheduledThreadPoolExecutor 实现了 ScheduledExecutorService。如果我不能将它与实际类一起使用,那么这个 Executors 调用的意义何在。

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

【问题讨论】:

    标签: java java.util.concurrent


    【解决方案1】:

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

    Source codeExecutors 类中:

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

    Delegated... 类(也有一个DelegatedExecutorService)只是将所有调用传递给底层执行程序,在本例中为ScheduledThreadPoolExecutor。代码中的 cmets 表明这些类的全部意义在于隐藏底层执行程序可能具有的所有非接口方法。

    无论如何,最好还是使用接口而不是您正在处理的对象的类版本(List 而不是ArrayListScheduledExecutorService 而不是ScheduledThreadPoolExecutor)。

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

    【讨论】:

    • 太好了,我知道我做错了,谢谢!经过一番思考,我明白了原因。
    • 所以,根据源代码:scheduled = new ScheduledThreadPoolExecutor(1)scheduler = Executors.newSingleThreadScheduledExecutor();是等价的吗?我只是想确定一下(我需要 ThreadPoolExecutor 因为我想调用它的一种方法)。
    • @theyuv 它们是等价的 except newSingleThreadScheduledExecutor() 故意让它失败。
    • 为什么?阻止我正在做的事情(调用实现类的方法)?
    【解决方案2】:

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

    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    

    【讨论】:

    • 现在我想起来了,这是有道理的。谢谢。
    • 如果我想更改仅在ScheduledThreadPoolExecutor 对象上可用的设置(即:setExecuteExistingDelayedTasksAfterShutdownPolicy)怎么办?
    【解决方案3】:

    为了简化:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多