com.oracle.coherence.common.internal.util.TimerTask Maven / Gradle / Ivy
Show all versions of coherence Show documentation
/*
* Copyright (c) 2000, 2020, Oracle and/or its affiliates.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* http://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.common.internal.util;
import com.oracle.coherence.common.base.Disposable;
import java.util.Date;
/**
* Modification of the Java TimerTask
class that is comparable based
* upon next execution time and insertion order.
*
* @author jh 2014.07.23
*/
public abstract class TimerTask
implements Runnable, Comparable, Disposable
{
/**
* This object is used to control access to the TimerTask internals.
*/
final Object lock = new Object();
/**
* The state of this task, chosen from the constants below.
*/
int state = VIRGIN;
/**
* This task has not yet been scheduled.
*/
static final int VIRGIN = 0;
/**
* This task is scheduled for execution. If it is a non-repeating task,
* it has not yet been executed.
*/
static final int SCHEDULED = 1;
/**
* This non-repeating task has already executed (or is currently
* executing) and has not been cancelled.
*/
static final int EXECUTED = 2;
/**
* This task has been cancelled (with a call to TimerTask.cancel).
*/
static final int CANCELLED = 3;
/**
* Next execution time for this task in the format returned by
* System.currentTimeMillis, assuming this task is scheduled for execution.
* For repeating tasks, this field is updated prior to each task execution.
*/
long nextExecutionTime;
/**
* Period in milliseconds for repeating tasks. A positive value indicates
* fixed-rate execution. A negative value indicates fixed-delay execution.
* A value of 0 indicates a non-repeating task.
*/
long period = 0;
/**
* The order in which this task was scheduled.
*/
long scheduleOrder;
/**
* Creates a new timer task.
*/
protected TimerTask() {
}
/**
* The action to be performed by this timer task.
*/
public abstract void run();
/**
* Cancels this timer task. If the task has been scheduled for one-time
* execution and has not yet run, or has not yet been scheduled, it will
* never run. If the task has been scheduled for repeated execution, it
* will never run again. (If the task is running when this call occurs,
* the task will run to completion, but will never run again.)
*
* Note that calling this method from within the run
method of
* a repeating timer task absolutely guarantees that the timer task will
* not run again.
*
*
This method may be called repeatedly; the second and subsequent
* calls have no effect.
*
* @return true if this task is scheduled for one-time execution and has
* not yet run, or this task is scheduled for repeated execution.
* Returns false if the task was scheduled for one-time execution
* and has already run, or if the task was never scheduled, or if
* the task was already cancelled. (Loosely speaking, this method
* returns true
if it prevents one or more scheduled
* executions from taking place.)
*/
public boolean cancel() {
synchronized(lock) {
boolean result = (state == SCHEDULED);
state = CANCELLED;
return result;
}
}
@Override
public void dispose()
{
cancel();
}
/**
* 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.)
*
*
This method is typically invoked from within a task's run method, to
* determine whether the current execution of the task is sufficiently
* timely to warrant performing the scheduled activity:
*
* public void run() {
* if (SafeClock.getSafeTimeMillis() - scheduledExecutionTime() >=
* MAX_TARDINESS)
* return; // Too late; skip this execution.
* // Perform the task
* }
*
* This method is typically not used in conjunction with
* fixed-delay execution repeating tasks, as their scheduled
* execution times are allowed to drift over time, and so are not terribly
* significant.
*
* @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.
* @see Date#getTime()
*/
public long scheduledExecutionTime() {
synchronized(lock) {
return (period < 0 ? nextExecutionTime + period
: nextExecutionTime - period);
}
}
// ---- Comparable interface --------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public int compareTo(TimerTask that) {
long nextExecutionTimeThis = this.nextExecutionTime;
long nextExecutionTimeThat = that.nextExecutionTime;
if (nextExecutionTimeThis == nextExecutionTimeThat) {
long scheduleOrderThis = this.scheduleOrder;
long scheduleOrderThat = that.scheduleOrder;
return scheduleOrderThis == scheduleOrderThat
? 0
: scheduleOrderThis < scheduleOrderThat
? -1
: 1;
} else {
return nextExecutionTimeThis == nextExecutionTimeThat
? 0
: nextExecutionTimeThis < nextExecutionTimeThat
? -1
: 1;
}
}
}