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.

В jdk1.6_10 это не рекомендуется, так что альтернативы нет.

Другие вопросы по тегам