public class Q { public static void main(String[] args) throws Exception { DelayQueue<Order> orders = new DelayQueue<>(); Order order1 = new Order(1000, "1x"); Order order2 = new Order(2000, "2x"); Order order3 = new Order(3000, "3x"); Order order4 = new Order(4000, "4x"); orders.add(order1); orders.add(order2); orders.add(order3); orders.add(order4); for (; ; ) { //沒有到期會阻塞 Order take = orders.take(); System.out.println(take); } } } class Order implements Delayed { @Override public String toString() { return "DelayedElement{" + "delay=" + delayTime + ", expire=" + expire + ", data='" + data + '\'' + '}'; } Order(long delay, String data) { delayTime = delay; this.data = data; expire = System.currentTimeMillis() + delay; } private final long delayTime; //延遲時間 private final long expire; //到期時間 private String data; //數據 /** * 剩餘時間=到期時間-當前時間 */ @Override public long getDelay(TimeUnit unit) { return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } /** * 優先隊列裏面優先級規則 */ @Override public int compareTo(Delayed o) { return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS)); } }