package com.dh.learn.queue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class LearnDelayQueue {
// DelayQueue 只能放置实现了Delayed接口的元素 底层使用的是PriorityQueue
//1. 在put时加了ReentrantLock,保证线程安全,由于是无界队列,在put时不会发生阻塞
//2. 在take时,根据每个Delayed元素的延时,利用Condition去await对应的时间,直到Delayed元素的延时为0时,就可以取出元素了。
public static void main(String[] args) {
DelayQueue<MyDelay> delayQueue = new DelayQueue<>();
delayQueue.put(new MyDelay("111"));
delayQueue.put(new MyDelay("222"));
delayQueue.put(new MyDelay("333"));
delayQueue.put(new MyDelay("444"));
System.out.println("开始时间" + System.currentTimeMillis());
try {
delayQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束时间" + System.currentTimeMillis());
}
static class MyDelay implements Delayed {
private String name;
private long start = System.currentTimeMillis();
private long time;
public MyDelay(String name) {
this.name = name;
//1s的延时
this.time = 1000;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert((start + time) -
System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return 0;
}
@Override
public String toString() {
return super.toString();
}
}
}