import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; public class DelayQueueTest { public static void main(String[] args) throws InterruptedException { DelayQueue<Customer> q = new DelayQueue<Customer>(); Customer c1 = new Customer(5, "customer1"); Customer c2 = new Customer(10, "customer2"); Customer c3 = new Customer(2, "customer3"); Customer c4 = new Customer(17, "customer3"); q.put(c1); q.put(c2); q.put(c3); q.put(c4); int count = 1; while (true) { Thread.sleep(1000); Customer c = null; // q.take() 则会阻塞 if (null != (c = q.poll())) { System.out.println("c : " + c.getName() + " , time:" + count+ "s"); } else { System.out.println("get object " + c + " , time:" + count + "s"); } count++; if (q.isEmpty()) { break; } } System.out.println("test finished"); } } class Customer implements Delayed { private String name; // unit miutes private long delayTime;// 需要延时的时间 public Customer(long delayTime, String name) { //当前时间+过期间隔=未来过期时间 this.delayTime = System.nanoTime() + TimeUnit.SECONDS.toNanos(delayTime); this.name = name; } @Override public int compareTo(Delayed o) { Customer c = (Customer) o; return this.delayTime > c.delayTime ? 1 : (this.delayTime < c.delayTime ? -1 : 0); } @Override public long getDelay(TimeUnit unit) { long sys = System.nanoTime(); // System.out.println("delayTime : " + delayTime // + " , System.nanoTime() " + sys); long minuts = delayTime - sys; return minuts; } public long getDelayTime() { return delayTime; } public String getName() { return name; } }
get object null , time:1s get object null , time:2s get object null , time:3s get object null , time:4s c : customer1 , time:5s get object null , time:6s get object null , time:7s get object null , time:8s get object null , time:9s c : customer2 , time:10s test finished