Разница между 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);
В чем разница между этими двумя способами планирования работы в будущем?
2 ответа
Самое большое отличие состоит в том, что Timer будет планировать все свои задачи в одном фоновом потоке. ExecutorService, с другой стороны, создаст новые потоки (при необходимости) для выполнения задач (вплоть до указанного вами размера пула, в котором точки задач будут поставлены в очередь).
Еще одно различие заключается в том, что существует необъяснимое исключение. В случае таймера фоновый поток прерывается, но не восстанавливается. С ScheduledExecutor (даже с однопотоковой конфигурацией) ScheduledExecutor может продолжаться после необработанного исключения. Он пытается обеспечить выполнение нужного количества потоков для обработки задач.
ScheduledExecutor также создает будущее в случае, если вы хотите взаимодействовать с прогрессом.