java.util.Timer: Это устарело?
Я прочитал в комментарии к этому ответу и во многих других вопросах о планировании (извините, нет ссылок), что java.util.Timer
устарела. Я действительно надеюсь, что нет, так как я использую его как легкий способ планировать вещи в Java (и это работает хорошо). Но если это устарело, я посмотрю в другом месте. Тем не менее, быстрый просмотр документации по API для 1.6 ничего не говорит о том, что она устарела. Это даже не упоминается в устаревшем списке Sun.
Это официально объявлено устаревшим* и если да, что я должен использовать вместо этого?
* С другой стороны, если это не считается устаревшим, могут ли люди прекратить ругать этот невинный и блестяще реализованный набор классов?
6 ответов
[JDK-8154799] устарел Timer и TimerTask в трекере ошибок JDK, и в середине 2016 года JEP 277 заявил, что java.util.Timer
(а также TimerTask
) не рекомендуется в JDK 9.
Некоторые API Java SE будут иметь добавленную, обновленную или удаленную аннотацию @Deprecated. Некоторые примеры таких изменений перечислены ниже.
[...]
- добавить @ признан
java.util.Timer
а такжеTimerTask
Однако в выпуске JDK 9 эти классы не являются устаревшими (устаревшие классы можно найти в устаревшем списке).
Как уже упоминали другие, нет, это не считается устаревшим, но я лично всегда использую ScheduledExecutorService
вместо этого, поскольку он предлагает более богатый API и большую гибкость:
ScheduledExecutorService
позволяет указать количество потоков, тогда какTimer
всегда использует один поток.ScheduledExecutorService
может быть построен сThreadFactory
разрешение контроля над аспектами потока, кроме статуса имени / демона (например, приоритет,ThreadGroup
,UncaughtExceptionHandler
).ScheduledExecutorService
позволяет планировать задачи с фиксированной задержкой, а также с фиксированной скоростью.ScheduledExecutorService
принимаетCallable
/Runnable
так как это единица работы, это означает, что вам не нужно подклассTimerTask
специально его использовать; то есть вы можете подать то же самоеCallable
реализация к регулярномуExecutorService
илиScheduledExecutorService
,
Я думаю, что это недоразумение. JavaDoc класса Timer упоминает ScheduledThreadPoolExecutor
и отмечает, что этот класс фактически является более универсальной заменой комбинации Timer / TimerTask. Ничего больше. Таймер не устарел.
Еще одна цитата из JavaDoc, ScheduledThreadPoolExecutor на этот раз:
ThreadPoolExecutor, который может дополнительно запланировать выполнение команд после заданной задержки или периодическое выполнение. Этот класс предпочтительнее, чем Timer, когда требуется несколько рабочих потоков или когда требуется дополнительная гибкость или возможности ThreadPoolExecutor (который расширяет этот класс).
Нет, не все. Возможно, вы захотите использовать другие механизмы, такие как Quartz, для более сложных требований к таймеру, но Timer работает отлично и никуда не денется.
Нет, это не рекомендуется. В дополнение к устаревшему списку Sun вы также увидите заметку в JavaDoc для класса, который устарел. Например, примечание для StringBufferInputStream гласит:
Устаревшее. Этот класс неправильно конвертирует символы в байты. Начиная с JDK 1.1, предпочтительным способом создания потока из строки является использование класса StringReader.