因为并发看到了ScheduledThreadPoolExecutor的实现里面有Dealyed,所以就学习一下基本使用,网上资料也不少,
Delayed这个接口继承了Comparable这个接口,所以实现这个接口现需要实现getDelay()和comapreTo方法;
对于getDelay方法里面的参数我一开始比较疑惑。因为看到的别人博客的示例代码有的没用到这个参数,所以不知道这个参数是干啥的。只知道要统一时间单位。在ScheduledThreadPoolExecutor的实现中找到了它的一种实现和使用。我们在实现中最好也按照jdk源码中的实现这样来写。
在DelayedQueue中也找到了里面的使用。
所以可以知道,在包装中,最后是转化为纳秒(TimeUnit.NANOSECONDS),也很好理解,因为这是里面最小的时间刻度了 ,也就是最精确。
在个人使用中,推荐使用ScheduledThreadPoolExecutor 中getDelay( )的实现。
下面是对DelayQueue的测试。
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayedQueneTest {
public static void main(String[] args) throws InterruptedException {
DelayQueue<Item> delayQueue = new DelayQueue<>();
delayQueue.add(new Item(10,"item1"));
delayQueue.add(new Item(15,"item2"));
delayQueue.add(new Item(5,"item3"));
delayQueue.add(new Item(20,"item4"));
int size = delayQueue.size();
for(int i=0;i< size;i++){
System.out.println(delayQueue.take().toString());
}
}
static class Item implements Delayed{
private long time;
private long delayTime;
private String Name;
public Item(long time,String name){
this.delayTime = time;
//因为是纳秒时间,所以如果直接time+system.nanoTime体现不出time的影响,所以提高
// time的权重
this.time = time*1000000 + System.nanoTime();
this.Name = name;
}
@Override
public String toString() {
return Name+" "+this.delayTime;
}
@Override
public long getDelay(TimeUnit timeUnit) {
return timeUnit.convert(this.time - System.nanoTime(),TimeUnit.NANOSECONDS);
}
@Override
public int compareTo(Delayed delayed) {
return this.time - ((Item)delayed).time > 0 ? 1 : -1;
}
}
}
输出如下