import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
* DelayedTask - Lets you add a task to a j.u.concurrent.DelayQueue
*
* @author Zeerix
*/
public class DelayedTask implements Runnable, Delayed {
private final Runnable task;
private final long endOfDelay;
/**
* Wraps a Runnable task so you can put it into a DelayQueue
*
* @param task
* the task that needs to be run after the delay
* @param delayMillis
* the delay in milliseconds
*/
DelayedTask(Runnable task, long delayMillis) {
this.task = task;
endOfDelay = System.currentTimeMillis() + delayMillis;
}
/**
* Runs the embedded task
*/
@Override
public void run() {
task.run();
}
/**
* Returns how long this task needs to be delayed
*
* @param unit
* the TimeUnit of the result
*/
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(endOfDelay - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
/**
* Compares order of two DelayedTasks
*
* @param delayed
* the other object to compare to
*/
@Override
public int compareTo(Delayed delayed) {
DelayedTask other = (DelayedTask) delayed;
if (endOfDelay < other.endOfDelay)
return -1;
else if (endOfDelay > other.endOfDelay)
return 1;
return 0;
}
}