Java.util.Timer: устарел ли он?

Я прочитал в комментарии этот ответ и во многих других вопросах о планировании (извините, никаких ссылок), что java.util.Timer устарел. Я действительно надеюсь, что с тех пор, как я использую его как легкий способ запланировать вещи на Java (и это работает хорошо). Но если он устанет, я посмотрю в другом месте. Тем не менее, быстрый просмотр API docs для 1.6 не говорит ничего о том, что он устарел. Это не даже упоминается в Sun Устаревший список.

Является ли это официально устаревшим * и если да, то что я должен использовать вместо этого?


* С другой стороны, , если он не устарел, могут ли люди перестать испортить этот невинный и блестяще реализованный set-o-classes?

Ответ 1

Существует [JDK-8154799] дестабилизировать таймер и таймер Task в трекере ошибок JDK и в середине 2016 года JEP 277 заявил, что java.util.TimerTimerTask) будет устаревшим в JDK 9.

В нескольких API Java SE добавлена ​​добавленная аннотация @Deprecated, обновлен или удален. Ниже приведены некоторые примеры таких изменений.

[...]

  • добавить @Deprecated в java.util.Timer и TimerTask

Однако в выпуске JDK 9 эти классы не устарели (устаревшие классы можно найти в Устаревший список).

Ответ 2

Как уже упоминалось, нет, это не устарело, но я лично всегда использую ScheduledExecutorService, поскольку он предлагает более богатый API и большую гибкость

  • ScheduledExecutorService позволяет указать количество потоков, тогда как Timer всегда использует один поток.
  • ScheduledExecutorService может быть сконструирован с ThreadFactory, позволяющим контролировать аспекты потока, отличные от статуса имени/демона (например, приоритет, ThreadGroup, UncaughtExceptionHandler).
  • ScheduledExecutorService позволяет планировать задачи с фиксированной задержкой, а также с фиксированной скоростью.
  • ScheduledExecutorService принимает Callable/Runnable как единицу работы, а это означает, что вам не нужно подклассом TimerTask специально использовать его; т.е. вы можете отправить ту же реализацию Callable в обычный ExecutorService или ScheduledExecutorService.

Ответ 3

Я думаю, что это недоразумение. Класс Timer JavaDoc упоминает ScheduledThreadPoolExecutor и отмечает, что этот класс является фактически более универсальной заменой комбинации Timer/TimerTask. Ничего больше. Таймер не устарел.

На этот раз другая цитата из JavaDoc, ScheduledThreadPoolExecutor:

A ThreadPoolExecutor, который может дополнительно планировать выполнение команд по истечении заданной задержки или выполнять их периодически. Этот класс является предпочтительным для Таймера, когда необходимы несколько рабочих потоков или когда требуется дополнительная гибкость или возможности ThreadPoolExecutor (который распространяется по этому классу).

Ответ 4

Нет. Не все. Вы можете использовать другие механизмы, такие как Quartz для более сложных требований к таймеру, но таймер работает отлично и никуда не денется.

Ответ 5

Нет, он не устарел. В дополнение к Sun Устаревший список, вы также увидите заметку в JavaDoc для класса, который устарел. Например, примечание для StringBufferInputStream говорит:

Устаревшие. Этот класс неправильно преобразовывает символы в байты. Начиная с JDK 1.1, предпочтительный способ создания потока из строки - через класс StringReader.

Ответ 6

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