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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值