Advantage of ScheduledExecutorService
over Timer
I wish to offer you an alternative to Timer
using – ScheduledThreadPoolExecutor, an implementation of the ScheduledExecutorService interface. It has some advantages over the Timer class, according to “Java in Concurrency”:
A
Timer
creates only a single thread for executing timer tasks. If a
timer task takes too long to run, the timing accuracy of other
TimerTask
can suffer. If a recurringTimerTask
is scheduled to run
every 10 ms and another Timer-Task takes 40 ms to run, the recurring
task either (depending on whether it was scheduled at fixed rate or
fixed delay) gets called four times in rapid succession after the
long-running task completes, or “misses” four invocations completely.
Scheduled thread pools address this limitation by letting you provide
multiple threads for executing deferred and periodic tasks.
Another problem with Timer is that it behaves poorly if a TimerTask
throws an unchecked exception. Also, called “thread leakage”
The Timer thread doesn’t catch the exception, so an unchecked
exception thrown from aTimerTask
terminates the timer thread. Timer
also doesn’t resurrect the thread in this situation; instead, it
erroneously assumes the entire Timer was cancelled. In this case,
TimerTasks that are already scheduled but not yet executed are never
run, and new tasks cannot be scheduled.
And another recommendation if you need to build your own scheduling service, you may still be able to take advantage of the library by using a DelayQueue
, a BlockingQueue
implementation that provides the scheduling functionality of ScheduledThreadPoolExecutor
. A DelayQueue
manages a collection of Delayed objects. A Delayed has a delay time associated with it: DelayQueue
lets you take an element only if its delay has expired. Objects are returned from a DelayQueue
ordered by the time associated with their delay.