An {@link ExecutorService} that can schedule commands to run after a givendelay, or to execute periodically.
The {@code schedule} methods create tasks with various delaysand return a task object that can be used to cancel or check execution. The {@code scheduleAtFixedRate} and{@code scheduleWithFixedDelay} methods create and execute tasksthat run periodically until cancelled.
Commands submitted using the {@link Executor#execute(Runnable)}and {@link ExecutorService} {@code submit} methods are scheduledwith a requested delay of zero. Zero and negative delays (but not periods) are also allowed in {@code schedule} methods, and aretreated as requests for immediate execution.
All {@code schedule} methods accept relative delays andperiods as arguments, not absolute times or dates. It is a simple matter to transform an absolute time represented as a {@link java.util.Date} to the required form. For example, to schedule ata certain future {@code date}, you can use: {@code schedule(task,date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)}. Beware however that expiration of a relative delay need not coincide with the current {@code Date} atwhich the task is enabled due to network time synchronization protocols, clock drift, or other factors.
The {@link Executors} class provides convenient factory methods forthe ScheduledExecutorService implementations provided in this package.
Usage Example
Here is a class with a method that sets up a ScheduledExecutorService to beep every ten seconds for an hour:
{@code import static java.util.concurrent.TimeUnit.*;}class BeeperControl private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beepForAnHour() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } }; final ScheduledFuture> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); } }, 60 * 60, SECONDS); } }}
@since 1.5
@author Doug Lea