Таймер Java по сравнению с ExecutorService?

У меня есть код, где я планирую использование задачи java.util.Timer. Я озирался и видел ExecutorService может сделать то же. Так этот вопрос здесь, используйте Вас Timer и ExecutorService запланировать задачи, что преимущество каждый использует по другому?

Также требуемый, чтобы проверить, использовал ли кто-либо Timer класс и столкнулся с любыми проблемами который ExecutorService решенный для них.

256
задан Kristian 17 October 2019 в 15:14
поделиться

0 ответов

Согласно [1 115] Параллелизм Java на практике :

  • Timer может быть чувствительно к изменениям в системных часах, ScheduledThreadPoolExecutor не.
  • Timer имеет только один поток выполнения, таким образом, продолжительная задача может задержать другие задачи. ScheduledThreadPoolExecutor может быть настроен с любым количеством потоков. Кроме того, Вы имеете полный контроль над созданными потоками, если Вы хотите (путем обеспечения ThreadFactory).
  • Исключения на этапе выполнения, добавленные TimerTask, уничтожают тот один поток, таким образом делая Timer мертвый:-(..., т.е. запланированные задачи не будут больше работать. ScheduledThreadExecutor не только ловит исключения на этапе выполнения, но и это позволяет Вам обработать их, если Вы хотите (путем переопределения afterExecute метод от ThreadPoolExecutor). Задача, которая выдала исключение, будет отменена, но другие задачи продолжат работать.

, Если можно использовать ScheduledThreadExecutor вместо [1 111], сделайте так.

Еще одна вещь..., в то время как ScheduledThreadExecutor не доступно в библиотеке Java 1.4, существует Бэкпорт JSR 166 (java.util.concurrent) к Java 1.2, 1.3, 1.4 , который имеет ScheduledThreadExecutor класс.

298
ответ дан jbatista 23 November 2019 в 02:44
поделиться

Если это доступно Вам, то трудно думать о причине не для использования платформы Java 5 исполнителя. Вызов:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

даст Вам ScheduledExecutorService со схожей функциональностью к Timer (т.е. это будет однопоточным), но чей доступ может быть немного более масштабируемым (под капотом, это использует параллельные структуры, а не полную синхронизацию как с Timer класс). Используя ScheduledExecutorService также дает, Вы способствуете, такие как:

  • можно настроить его в случае необходимости (см. newScheduledThreadPoolExecutor() или ScheduledThreadPoolExecutor класс)
  • 'один от' выполнения может возвратить результаты

О единственных причинах того, чтобы придерживаться Timer, я могу думать:

  • Это доступно пред Java 5
  • А, который подобный класс обеспечивается в J2ME, который мог сделать портирование Вашего приложения легче (но не будет ужасно трудно добавить общий слой абстракции в этом случае)
61
ответ дан Eliran Malka 23 November 2019 в 02:44
поделиться

ExecutorService является более новым и более общим. Таймер является просто потоком, который периодически выполняет материал, который Вы запланировали для него.

ExecutorService может быть пулом потоков, или выровнять распространение через другие системы в кластере и сделать вещи как одноразовое пакетное выполнение, и т.д.

Только посмотрели на то, что каждый предлагает решать.

22
ответ дан Dustin 23 November 2019 в 02:44
поделиться

Вот некоторые более хорошие методы вокруг использования Таймера:

http://tech.puredanger.com/2008/09/22/timer-rules/

В целом, я использовал бы Таймер для быстрого и грязного материала и Исполнителя для большего количества устойчивого использования.

15
ответ дан Alex Miller 23 November 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: