DelayQueue使用實例


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM