Timer : Java Glossary

If you want a task to be run at some time in the future or repeatedly at regular
intervals, in Java version 1.3 or later, you can schedule it with
the java.util.Timer class. This is more efficient than
creating a Thread for the purpose and sleeping.
java.util.Timer efficiently handles all such future events
with a single thread. If the event you want to spawn takes a long time, it should
spawn its own thread so as not to hold up other events being handled.

The whole idea of java.util.Timer is to avoid the
overhead of creating a new Thread for every task. So there
is only one Thread to handle all the tasks scheduled on a
given Timer. That it why it must execute the tasks
sequentially even if scheduled at the same time. If you want two tasks to run
simultaneously you will need to either spawn a separate task when the trigger happens
or use two Timers.

java.util.Timer

javax.swing.Timer

In Java version 1.2 or later, javax.swing.Timer has similar capabilities. Use it only for
GUI (Graphic User Interface) activities since the actions tie up the Swing thread,
which is what you want for Swing method invocations. You don’t need
SwingUtilities. invokeLater
with javax.swing.Timer since it automatically dispatches
your Runnable on the EDT (Event Dispatch Thread).

In Java version 1.5 or later there is an even more
sophisticated timer called java.util.concurrent.ScheduledThreadPoolExecutor.

Long-Running Events

Timers work
with a single Thread. That means your event must complete
before the next event needs to be scheduled. If you have a very long running event to
be scheduled, have your Timer event start a new
Thread to run in the background in parallel with the
TimerThread.

See the warning under Gotchas:Threads on why a sleeping task waiting for the
next timer event may never waken if somebody fiddles with the system clock setting
while your thread is asleep.