Разница между TimerTask и Executors.newScheduledThreadPool(1)
Мне нужно запланировать некоторую работу, которая будет выполнена в будущем. Я могу сделать это двумя способами:
-
Создайте TimerTask
и выполните timer.schedule(...);
-
Используйте Executors.newScheduledThreadPool(1)
:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ScheduledFuture <?> scheduleHandle = scheduler.schedule(pushExternalRunnable,
runScheduleDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS);
В чем разница между этими двумя способами планирования работы в будущем?
Ответы
Ответ 1
Самое большое различие заключается в том, что Timer будет планировать все свои задачи на одном фоновом потоке. С другой стороны, ExecutorService создаст новые потоки (при необходимости) для запуска задач (до размера указанного вами пула, после чего задачи будут поставлены в очередь.)
Ответ 2
Еще одно отличие состоит в том, что есть неперехваченное исключение. В случае таймера фоновый поток завершается, но он не восстанавливается. С помощью ScheduledExecutor (даже с одной конфигурацией потока) ScheduledExecutor может продолжить работу после неперехваченного исключения. Он пытается обеспечить необходимое количество потоков для обработки задач.
ScheduledExecutor также создает будущее в случае, если вы хотите взаимодействовать с прогрессом.