zoukankan      html  css  js  c++  java
  • Java基础——消息队列

    1、消息队列的适用场景:商品秒杀、系统解耦、日志记录等

    2、使用Queue实现消息对列

    双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取
    阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行,比如当添加元素时,如果队列元素已满,队列则会阻塞等待直到有空位时再插入
    非阻塞队列,和阻塞队列相反,它会直接返回操作的结果,而非阻塞等待操作,双端队列也属于非阻塞队列

     //定义消息队列
        private static Queue<Object> queue = new LinkedList<>();
        public static  void main(String[] args){
            producter();
            consumer();
        }
    
        /**
         * 生产者
         */
        public static void producter(){
            queue.add("first");
            queue.add("second");
            queue.add("third");
        }
    
        /**
         * 消费者
         */
        public static void consumer(){
            while(!queue.isEmpty()) {
                System.out.println(queue.poll());
            }
        }
    
    运行结果:可以看出对列是先入先出
    first
    second
    third

    3、使用DelayQueue实现延迟队列

    import lombok.Getter;
    import lombok.Setter;
    
    import java.text.DateFormat;
    import java.util.Date;
    import java.util.concurrent.DelayQueue;
    import java.util.concurrent.Delayed;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 自定义延迟队列
     */
    public class CustomDelayQueue {
        // 延迟消息队列
        private static DelayQueue delayQueue = new DelayQueue();
    
        public static void main(String[] args) throws InterruptedException {
            producer(); // 调用生产者
            consumer(); // 调用消费者
        }
    
        // 生产者
        public static void producer() {
            // 添加消息
            delayQueue.put(new MyDelay(1000, "消息1"));
            delayQueue.put(new MyDelay(3000, "消息2"));
        }
    
        // 消费者
        public static void consumer() throws InterruptedException {
            System.out.println("开始执行时间:" +
                    DateFormat.getDateTimeInstance().format(new Date()));
            while (!delayQueue.isEmpty()) {
                System.out.println(delayQueue.take());
            }
            System.out.println("结束执行时间:" +
                    DateFormat.getDateTimeInstance().format(new Date()));
        }
    
        /**
         * 自定义延迟队列
         */
        static class MyDelay implements Delayed {
            // 延迟截止时间(单位:毫秒)
            long delayTime = System.currentTimeMillis();
    
            // 借助 lombok 实现
            @Getter
            @Setter
            private String msg;
    
            /**
             * 初始化
             * @param delayTime 设置延迟执行时间
             * @param msg       执行的消息
             */
            public MyDelay(long delayTime, String msg) {
                this.delayTime = (this.delayTime + delayTime);
                this.msg = msg;
            }
    
            // 获取剩余时间
            @Override
            public long getDelay(TimeUnit unit) {
                return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
            }
    
            // 队列里元素的排序依据
            @Override
            public int compareTo(Delayed o) {
                if (this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS)) {
                    return 1;
                } else if (this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS)) {
                    return -1;
                } else {
                    return 0;
                }
            }
    
            @Override
            public String toString() {
                return this.msg;
            }
        }
    }

                 

  • 相关阅读:
    Java 9的14个新特性总结
    各版本JDK1.5-1.8新特性
    数据库(分库分表)中间件对比
    使用IntelliJ IDEA创建Maven多模块项目
    深入解析淘宝Diamond之客户端架构
    淘宝Diamond架构分析
    apktool 工具
    ubuntu jdk 1.7 安装
    dot 使用笔记
    Chomsky_hierarchy
  • 原文地址:https://www.cnblogs.com/carblack/p/12906733.html
Copyright © 2011-2022 走看看