package compbio.stat.servlet.util; import java.util.TimerTask; /** * A task that can be scheduled for recurring execution by a {@link Scheduler}. */ public abstract class SchedulerTask implements Runnable { final Object lock = new Object(); int state = VIRGIN; static final int VIRGIN = 0; static final int SCHEDULED = 1; static final int CANCELLED = 2; TimerTask timerTask; /** * Creates a new scheduler task. */ protected SchedulerTask() { } /** * The action to be performed by this scheduler task. */ public abstract void run(); /** * Cancels this scheduler task. *
* This method may be called repeatedly; the second and subsequent calls have no effect.
*
* @return true if this task was already scheduled to run
*/
public boolean cancel() {
synchronized (lock) {
if (timerTask != null) {
timerTask.cancel();
}
boolean result = (state == SCHEDULED);
state = CANCELLED;
return result;
}
}
/**
* Returns the scheduled execution time of the most recent actual execution of
* this task. (If this method is invoked while task execution is in progress,
* the return value is the scheduled execution time of the ongoing task execution.)
*
* @return the time at which the most recent execution of this task was scheduled
* to occur, in the format returned by Date.getTime()
. The return value
* is undefined if the task has yet to commence its first execution.
*/
public long scheduledExecutionTime() {
synchronized (lock) {
return timerTask == null ? 0 : timerTask.scheduledExecutionTime();
}
}
}