• 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

  • 相关阅读:
    设计模式(三)--观察者模式
    设计模式(二)--单例模式
    tornado 资源
    复习 网络通信协议
    设置允许远程连接MySQL (Ubuntu为例)
    ubuntu 下安装ssh服务
    Python 运算内建函数
    py知识点拾遗之sort(),sorted(),reverse(),reversed()
    SQLite安装 以及 SQLite header and source version mismatch错误解决 (In debian)
    debian折腾笔记
  • 原文地址:https://www.cnblogs.com/koushr/p/9483834.html
Copyright © 2020-2023  润新知