DelayQueue是延遲阻塞隊列。這種特性可以讓我們做一些ArrayBlockingQueue、LinkedBlockingQueue這種常規阻塞隊列所做不到的事情。比如說銀行轉賬24h后才到賬,微信轉賬2h到賬或者24小時到賬。
public class DelayQueueTest { public static void main(String[] args) { DelayQueue<MyTimerRunnable> blockingQueue = new DelayQueue<>(); blockingQueue.put(new MyTimerRunnable(System.currentTimeMillis() + 10 * 1000, () -> System.out.println(10))); blockingQueue.put(new MyTimerRunnable(System.currentTimeMillis() + 5 * 1000, () -> System.out.println(5))); blockingQueue.put(new MyTimerRunnable(System.currentTimeMillis() + 15 * 1000, () -> System.out.println(15))); System.out.println("開始---" + System.currentTimeMillis()); for (; ; ) { try { MyTimerRunnable timerRunnable = blockingQueue.take(); System.out.println("處理---" + System.currentTimeMillis()); Runnable runnable = timerRunnable.getRunnable(); if (runnable != null) { runnable.run(); } } catch (Exception e) { e.printStackTrace(); } } } }
MyTimerRunnable是我們自定義的Delayed接口的實現類,里面定義了一些屬性,包括執行時間以及執行的任務。自定義類必須實現Delayed接口的getDelay()方法和Delayed接口繼承自Comoarable接口的compareTo()方法。
public class MyTimerRunnable implements Delayed { private long processTime; private Runnable runnable; public long getProcessTime() { return processTime; } public Runnable getRunnable() { return runnable; } public MyTimerRunnable(long processTime, Runnable runnable) { this.processTime = processTime; this.runnable = runnable; } @Override public long getDelay(@NotNull TimeUnit unit) { return processTime - System.currentTimeMillis(); } @Override public int compareTo(@NotNull Delayed o) { return (int) (getProcessTime() - ((MyTimerRunnable) o).getProcessTime()); } }
打印結果是
開始---1584076398361
處理---1584076403361
5
處理---1584076408322
10
處理---1584076413361
15
