/**
* A standard implementation for Delayed interface
*
* A Delayed instance means something which has a time attribute. Generally means a thread
* will start up this time later.
*
* And obviously, Delayed instances can be compared with each other – which one sooner,
* which one is later. So, Delayed extends Comparable<Delayed>
*
* Delayed instances can be put into DelayQueue.
* DelayQueue is declared in the following way:
* DelayQueue<E extends Delayed>
*
* DelayQueue has 2 characters:
* 1) All Delayed instances are automatically sorted – the most urgent Delayed instance will
* be returned when take() method is called on the DelayQueue
* 2) Only Expired Delayed instances are visible in the DelayQueue – if no expired instance
* – take() method will block.
*
* From this point of view, DelayQueue is an advanced unbounded BlockingQueue
*
*/
class DelayedTask implements Runnable, Delayed
{
private final int delta;
private final long trigger;
public DelayedTask(int delayInMilliseconds)
{
delta = delayInMilliseconds;
trigger = System.nanoTime() + NANOSECONDS.convert(delta, MILLISECONDS);
}
//--These 2 methods are required by Delayed interface, you must implement them
//--And exactly in this way----------------------------------------------------
//--Delayed interface extends Comparable<Delayed>------------------------------
public long getDelay(TimeUnit unit)
{
return unit.convert(trigger - System.nanoTime(), NANOSECONDS);
}
public int compareTo(Delayed arg)
{
DelayedTask that = (DelayedTask) arg;
if (trigger < that.trigger) return -1;
if (trigger > that.trigger) return 1;
return 0;
}
//-----------------------------------------------------------------------------
}
Another thing to mention is TimeUnit convert.
NANOSECONDS.convert(delta, MILLISECONDS);
This line means delta is a value in MILLISECONDS, and I want to convert it into NANOSECONDS.
unit.convert(trigger - System.nanoTime(), NANOSECONDS);
This line means trigger - System.nanoTime() is a value in NANOSECONDS, and I want to convert it into unit value.
A DelayQueue sample code is attached.