Ответ 1
- где задача должна запускаться в течение следующих 1 минуты, уже выполняется объект задачи
Нет, он вызовет метод run этой задачи ровно через 60 секунд. Если task.cancel()
возвращает false
, это может означать 3 вещи:
- задача была запланирована для однократного выполнения и уже выполнена OR
- задача никогда не планировалась OR
- задача была отменена OR
Следовательно, если вы уверены, что вы вызываете cancel
до 60 секунд после планирования задачи, вы можете потенциально либо вызвать ее несколько раз, либо получить результат от последующего cancel
, либо вы вызываете отмену на другая задача.
В общем, я бы рекомендовал против Timer в пользу ScheduledExecutorService
Вы можете добиться желаемой функциональности с помощью
ScheduledExecutorService.schedule(вызываемый, задержка, время)
Причины, по которым ScheduledExecutorService являются предпочтительным способом, обозначены здесь:
-
Таймер может быть чувствителен к изменениям в системных часах, ScheduledThreadPoolExecutor не
-
Таймер имеет только один поток выполнения, поэтому длительная задача может задержать другие задачи. ScheduledThreadPoolExecutor может быть настроен с любым количеством потоков. Кроме того, вы имеете полный контроль над созданными потоками, если хотите (предоставляя ThreadFactory)
-
Исключения, запущенные в TimerTask, убивают один поток, что делает Timer dead:-(... т.е. запланированные задачи больше не выполняются. ScheduledThreadExecutor не только улавливает исключения во время выполнения, но и позволяет обрабатывать их, если вы хотите (путем переопределения метода afterExecute из ThreadPoolExecutor). Задача, которая запустила исключение, будет отменена, но другие задачи будут продолжать выполняться.