Разница между 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 также создает будущее в случае, если вы хотите взаимодействовать с прогрессом.