Когда Java TimerTask запланирован в таймере, он уже "выполняется"?

Я хотел бы уточнить кое-что о TimerTask. Когда у вас есть код ниже:

timer.schedule(task, 60000);

где задача выполняется в следующей 1 минуты, задача уже выполняется?

потому что где-то в моем коде я позвонил задач.cancel () но кажется, что вызов не предотвращает

задача для выполнения. Я даже зарегистрировал возвращаемое значение из вызова, и оно возвращает false.

Я пришел о моем вопросе, когда я прочитал документация по методу cancel:

отменяет задачу TimerTask и удаляет ее из очереди таймера. Как правило, он возвращает false, если вызов не предотвратил TimerTask от бега хотя бы раз. Последующие вызовы не имеют эффекта. Возвращает true, если вызов предотвратил запланированное выполнение, в противном случае-false.

Я считаю, что я позвонил cancel () до 1-минутной задержки. Но почему cancel вернул false,

это [задача] уже выполняется?

надеюсь, вы можете дать мне подсказки/подсказки или даже объяснение этому. Спасибо!

2 ответов


  • где задача запланирована для запуска в течение следующей 1 минуты, объект задачи уже выполняется

нет, он собирается вызвать run метод этой задачи ровно за 60 секунд. Если task.cancel() возвращает false, это может означать 3 вещи:

  • задача была запланирована для одноразового выполнения и уже работать или
  • задача не была запланирована или
  • задание уже отменено Или

следовательно, если вы уверены, что звоните cancel до 60 секунд после планирования задачи вы можете потенциально вызвать ее несколько раз и получить результат от последующего cancel, или вы вызываете cancel для другой задачи.


в общем, я бы порекомендовал против таймер в пользу ScheduledExecutorService

вы можете добиться желаемой функциональности с:

ScheduledExecutorService.расписание (вызывается, задержка, timeunit)

причины, почему ScheduledExecutorService является предпочтительным способом изложены здесь:

  • таймер может быть чувствителен к изменениям в системных часах, ScheduledThreadPoolExecutor не

  • таймер имеет только один поток выполнения, поэтому длительная задача может задерживать другие задачи. ScheduledThreadPoolExecutor может быть настроено с любым количеством потоков. Кроме того, вы имеете полный контроль над созданными потоками, если хотите (предоставив ThreadFactory)

  • исключения времени выполнения, брошенные в TimerTask, убивают этот поток, тем самым делая таймер мертвым : - (... т. е. запланированные задачи больше не будут выполняться. ScheduledThreadExecutor не только улавливает исключения среды выполнения, но и позволяет обрабатывать их, если вы хотите (путем переопределения метода afterExecute из ThreadPoolExecutor). Задача, которая вызвала исключение будут отменены, но другие задачи будут продолжать выполняться.


Я не знаю, почему ваш код возвращает false.

следующий код выведет true.

import java.util.Timer;
import java.util.TimerTask;


public class Test {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                System.out.println("hi");
            }

        };
        timer.schedule(task, 60000);
        System.out.println(task.cancel());
    }
}

если последний println комментируется, программа печатает hi.