Поскольку SchedulerHandle является окончательным, и вы не определили его сразу, ваш компилятор предупреждает вас, что он может не инициализироваться в методе run ().
Просто сделайте:
final ScheduledFuture SchedulerHandle = ExtractorTimer.scheduleWithFixedDelay (...
Обновление: это было просто неправильно. Давайте посмотрим, вы хотите вызывать DB.buildConnection () каждые 60 секунд, пока он не вернет true. К сожалению, вы не можете ссылаться на SchedulerHandle, возвращенный от scheduleWithFixedDelay () в Runnable, с которым вы вызываете метод, потому что 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, и любая данная задача будет отменена! Будущее schedule () также не будет выполнено. Единственный способ сделать его снова пригодным для использования - это создать новый ScheduledExecutorService - это недостаток этого подхода.
Так что, если вы хорошо используете ExtractorTimer только для этой одной задачи, все должно быть хорошо.