Что мне делать сначала - отменить ScheduledFuture или shutdown ScheduledExecutorService?

Мой код:

ScheduledServiceExecutor service = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture future = service.scheduleWithFixedDelay(
  runnable, 1, 1, TimeUnit.MILLISECONDS
);
// ...
// now it time to shut it all down
future.cancel(true);
service.shutdown();

Я здесь? Может быть, я должен сделать:

service.shutdown();
future.cancel(true);

Как вы думаете?

Ответы

Ответ 1

В этом случае вам нужен только вызов shutdown().

В ScheduledThreadPoolExecutor есть два варианта: это то, что создается за кулисами здесь. getExecuteExistingDelayedTasksAfterShutdownPolicy() по умолчанию установлено значение true и getContinueExecutingPeriodicTasksAfterShutdownPolicy() по умолчанию false. Таким образом, просто выключение службы вызовет периодические задачи, которые будут отменены, но любые отложенные задачи будут выполняться. Поскольку задача, о которой идет речь, является периодической задачей, она будет отменена при завершении работы.

Мое личное мнение состоит в том, что лучше вызывать .cancel(true) вручную перед выключением. Хотя в оперативном режиме это не имеет никакого эффекта, я думаю, что это хорошо для программистов, которые могут не знать вариантов у исполнителя, чтобы увидеть, что периодическая задача должна быть отменена при завершении работы. Это также означает, что если кто-либо когда-либо приходит и меняет исполнителя на тот, который не отменяется при завершении работы, эта задача все равно будет отменена. Так что, на самом деле, я думаю, что основное преимущество здесь - ясность кода.