Delayed interface and Delay Queue

/**

 * 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.

你可能感兴趣的:(thread,UP)