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;
        }
    }
}

           

最新文章

  1. Android 实时监测(监听)网络连接状态变化
  2. LoadRunner error -27979
  3. Ubuntu Server 中resolv.conf重启时被覆盖的问题
  4. 【转】SQL删除重复数据方法
  5. Block介绍(二)内存管理与其他特性
  6. 再看C
  7. NET版微信客户端.
  8. Python:学会创建并调用函数
  9. Java IO流--练习2
  10. Docker实例:创建一个点到点连接
  11. 在IDEA中设置命令行参数
  12. bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)
  13. Trailing slash
  14. 搭建前端监控系统(二)JS错误监控篇
  15. python---不支持中文注释解决办法
  16. [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]
  17. exception javax.crypto.BadPaddingException: Given final block not properly padded
  18. angularJS中的MVC思想?
  19. 用 free 或 delete 释放了内存之后,立即将指针设置为 NULL,防止产 生“野指针”
  20. GET和POST请求的区别如下

热门文章

  1. 轻松应对并发,Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单
  2. [PyTorch 学习笔记] 2.2 图片预处理 transforms 模块机制
  3. Micro-CMS v1 (Hacker101 CTF)
  4. C# Chart各个属性详细解析、应用
  5. java初探(1)之秒杀的安全
  6. [BUUOJ记录] [BJDCTF2020]The mystery of ip
  7. FIddlerd的下载教程和使用教程
  8. Agumater 增加基本数据上传下载能力
  9. python pickle库
  10. Spring的循环依赖,学就完事了【附源码】