Ответ 1
Просто отмените будущее, возвращенное scheduledAtFixedRate()
:
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
ScheduledFuture<?> scheduledFuture =
scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS);
Thread.sleep(5000L);
scheduledFuture.cancel(false);
}
Еще одна вещь, которую следует отметить, заключается в том, что отмена не удаляет задачу из планировщика. Все это гарантирует, что метод isDone всегда возвращает true. Это может привести к утечке памяти, если вы продолжаете добавлять такие задачи. Например, если вы запускаете задачу на основе некоторой активности клиента или кнопки пользовательского интерфейса, повторите ее n раз и выйдите. Если эта кнопка нажата слишком много раз, вы можете получить большой пул потоков, которые не могут быть собраны в мусор, поскольку планировщик все еще имеет ссылку.
Вы можете использовать setRemoveOnCancelPolicy (true) в классе ScheduledThreadPoolExecutor, доступном в Java 7 и далее. Для обратной совместимости по умолчанию установлено значение false.