Mam kod, w którym planuję zadanie za pomocą java.util.timer
. Rozejrzałam się i zobaczyłam, że ExecutorService
może zrobić to samo. Mam więc pytanie: czy używaliście Timera i ExecutorService do planowania zadań?
1 odpowiedź
Timer
może być wrażliwy na zmiany w zegarze systemowym, ScheduledThreadPoolExecutor
nie jest.
Timer
ma tylko jeden wątek wykonania, więc długotrwałe zadanie może opóźnić inne zadania. ScheduledThreadPoolExecutor
można skonfigurować z dowolną liczbą wątków. Ponadto masz pełną kontrolę nad utworzonymi wątkami, jeśli chcesz (udostępniając ThreadFactory).
Wyjątki czasu wykonywania zgłoszone w TimerTask
zabijają ten jeden wątek, przez co Timer
jest martwy. tj. Zaplanowane zadania nie będą już działać. ScheduledThreadExecutor
nie tylko przechwytuje wyjątki czasu wykonywania, ale umożliwia ich obsługę, jeśli chcesz (poprzez przesłonięcie metody afterExecute
z ThreadPoolExecutor
) Zadanie, które zgłosiło wyjątek, zostanie anulowane, ale inne zadania będą nadal działać.
Jeśli możesz użyć ScheduledThreadExecutor zamiast Timera, zrób to.