Подтвердить что ты не робот

Как удалить задачу из ScheduledExecutorService?

У меня есть служба ScheduledExecutorService, которая периодически выполняет несколько разных задач с помощью .scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);

У меня также есть другой Runnable, который я использую с этим планировщиком. проблема начинается, когда я хочу удалить одну из задач из планировщика.

есть ли способ сделать это?

Я делаю правильно, используя один планировщик для разных задач? что это лучший способ реализовать это?

4b9b3361

Ответ 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.

Ответ 2

Если ваш экземпляр ScheduledExecutorService расширяет ThreadPoolExecutor (например, ScheduledThreadPoolExecutor), вы можете использовать remove(Runnable) (но см. примечание в своем javadoc: "Он может не удалять задачи, которые были преобразованы в другие формы до помещается во внутреннюю очередь." ) или purge().