java.util.Timer: Это устарело? - PullRequest
17 голосов
/ 06 февраля 2010

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

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


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

Ответы [ 6 ]

15 голосов
/ 06 февраля 2010

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

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

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

Еще одна цитата из JavaDoc, ScheduledThreadPoolExecutor на этот раз:

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

6 голосов
/ 06 февраля 2010

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

4 голосов
/ 03 августа 2016

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

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

[...]

  • добавить @ Устарело к java.util.Timer и TimerTask

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

4 голосов
/ 06 февраля 2010

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

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

2 голосов
/ 06 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...