Только что увидел это сейчас ... потому что я хотел сделать то же самое ... вот мое решение, я подозреваю, что это потокобезопасно.
Сначала создайте контейнер для будущего:
public static class Cancel {
private ScheduledFuture<?> future;
public synchronized void setFuture(ScheduledFuture<?> future) {
this.future = future;
}
public synchronized void stop() {
LOG.debug("cancelling {}", future);
future.cancel(false);
}
}
А затем код будущего:
final Cancel controller = new Cancel();
synchronized (controller) {
ScheduledFuture<?> future = scheduler.scheduleWithFixedDelay(() -> {
if (<CONTINUE RUNNING CONDITION) {
} else {
// STOP SCHEDULABLE FUTURE
controller.stop();
}
}, startTime, timeBetweenVisbilityChecks);
controller.setFuture(future);
}
}
Итак, обратите внимание, что останов не будет вызываться до тех пор, пока не будет создано будущее и не будет установлено будущее на контроллере.
Имейте в виду, что Runnable - это аномичный внутренний класс, и он будет запущен в другом потоке.