DelayQueue

DelayQueue就是一个优先级队列,他的优先级按照里面元素的延迟时间来决定,延迟时间小的(也就是时间先到的)放在队列头(这与add的顺序无关),与元素本身的属性值有关。

DelayQueue中的元素必须是实现了Delayed接口的,而Delayed接口又是Comparable的子接口,因此DelayQueue中的元素必须覆盖Delayed接口的getDelay(TimeUnit)方法和Comparable的compareTo()方法,其实两个方法的实现都很简单。

前者:
public long getDelay(TimeUnit tu)
{
return time.System.currentTimeMillis();
}
后者:
public int compareTo(Delayed d)
{
T t=(T)d;
if(time<d.getTime())//如果自己比人家小,返回负值
return -1;
else if(time>d.getTime())//如果自己比人家大,返回正值
return 1;
else return 0;
}


关于DelayQueue的代码如下:

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.DelayQueue;
public class TestDelayQueue
{
public static void checkin(Customer cus,DelayQueue queue)
{
queue.add(cus);
System.out.println("网民"+cus.getId()+":开始上机");
}
public static void main(String [] args)
{
DelayQueue<Customer> queue=new DelayQueue<Customer>();
Customer cus1=new Customer("1",10000+System.currentTimeMillis());
Customer cus2=new Customer("2",50000+System.currentTimeMillis());
Customer cus3=new Customer("3",20000+System.currentTimeMillis());
checkin(cus1,queue);
checkin(cus2,queue);
checkin(cus3,queue);
while(queue.size()>0)
{
try
{
Customer off=queue.take();
System.out.println("网民"+off.getId()+":下机");
}
catch (Exception e)
{
e.printStackTrace();
}
}
System.out.println("网吧内已经没有顾客");
}
}
class Customer implements Delayed
{
private String id;
private long time;
public Customer(String id,long time)
{
this.id=id;
this.time=time;
}
public String getId()
{
return this.id;
}
public long getTime()
{
return time;
}
public long getDelay(TimeUnit tu)
{
return time-System.currentTimeMillis();
}
public int compareTo(Delayed d)//当前比外来户小返回负值,当前比外来户大返回正值
{
Customer c=(Customer)d;
if(time>c.getTime())
return 1;
else if(time<c.getTime())
return -1;
else
return 0;
}
}


大家会发现,Customer中有个属性time,这个属性是绝对时间,即希望当前对象被执行的时间,getDelay是覆盖Delayed的函数,这个函数返回相对的时间,系统也正是利用这个来判断还有多长时间要执行某个对象。而compareTo用来确定队列中对象的先后顺序,当然希望从小打到大排序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值