Разница между TimerTask и Executors.newScheduledThreadPool(1)

Мне нужно наметить некоторую работу, которая будет сделана в будущем. Я могу сделать это двумя способами:

  1. Создать TimerTask и выполнить timer.schedule(...);

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

Другие вопросы по тегам