我写了这段代码:
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/