有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何扩展AbstractScheduledService。调度程序

我试图扩展AbstractScheduledService.Scheduler,以便使用一个在实例变量中存储初始延迟和周期的计划

我正在尝试以下内容

public class ScannerScheduler extends AbstractScheduledService.Scheduler {

    @Override
    public final Future<?> schedule(AbstractService as, 
        ScheduledExecutorService ses, Runnable task) {
        Executors.newSingleThreadScheduledExecutor()
                 .scheduleAtFixedRate(task, 0, 1, TimeUnit.DAYS);
    }
}

但编译器仍然抱怨:

ScannerScheduler is not abstract and does not override abstract method schedule(AbstractService,ScheduledExecutorService,Runnable) in Scheduler

我错过了什么


共 (2) 个答案

  1. # 1 楼答案

    修订版

    Scheduler类有一个private构造函数,这意味着如果不修改Guava库代码,就无法扩展它

    因此,您需要采用javadocs建议的替代方法

    If more flexibility is needed then consider subclassing CustomScheduler.


    (在这种情况下,编译错误有点误导……但底线是extend方法不起作用。)

  2. # 2 楼答案

    AbstractScheduledService的方法Future<?> schedule(AbstractService service, ScheduledExecutorService executor, Runnable runnable)是最终的,因此不能被重写

    参见第393行:https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java?r=d0f4023bd9027b21d9ef3f8077651ad0d2c2275d

    从那里的代码来看,类Scheduler中的相同方法签名似乎可以被重写,但不知道这是否有助于您:

    new Scheduler() {
        @Override
        public Future<?> schedule(AbstractService service, ScheduledExecutorService executor,
            Runnable task) {
          return executor.scheduleWithFixedDelay(task, initialDelay, delay, unit);
        } 
      };