我写了这段代码:

ScheduledExecutorService ExtractorTimer=Executors.newScheduledThreadPool(1);
final ScheduledFuture<?> SchedulerHandle;
SchedulerHandle =ExtractorTimer.scheduleWithFixedDelay(
    new Runnable() {
        public void run() {
            if(DB.buildConnection()){
                  SchedulerHandle.cancel(false);
            }
        }
     },0, 60,java.util.concurrent.TimeUnit.SECONDS);


它给出了:

Variable SchedulerHandle might not have benn initialized


问题是什么?
我该如何解决?

最佳答案

因为SchedulerHandle是最终的,并且您没有立即定义它,所以编译器会警告您,它可能未在run()方法中初始化。
只需做:


  最后的ScheduledFuture SchedulerHandle = ExtractorTimer.scheduleWithFixedDelay(...
  


更新:那是完全错误的。让我们看看,您想每60秒调用一次DB.buildConnection(),直到它返回true。不幸的是,您不能在调用该方法的Runnable中引用从scheduleWithFixedDelay()返回的SchedulerHandle,因为必须首先定义Runnable,但它不知道什么是SchedulerHandle,因为它当时不存在。

因此,取消该过程的另一种方法是终止ScheduledExecutorService,如下所示:

ScheduledExecutorService ExtractorTimer=Executors.newScheduledThreadPool(1);
final ScheduledFuture<?> SchedulerHandle;
SchedulerHandle =ExtractorTimer.scheduleWithFixedDelay(
    new Runnable() {
        public void run() {
            if(DB.buildConnection()){
                  ExtractorTimer.shutdown();
            }
        }
    },0, 60,java.util.concurrent.TimeUnit.SECONDS);


但是请注意,如果执行此操作,则无法重用ExtractorTimer,任何给定的任务都将被取消!将来的时间表也将不会执行。使它再次可用的唯一方法是创建一个新的ScheduledExecutorService-这是此方法的缺点。

因此,如果您可以只将ExtractorTimer用于一项任务,那么一切都会很好。

关于java - 变量可能尚未为最终变量和匿名类初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9956687/

10-10 12:59