Java基础——消息队列
2024-08-31 23:17:53
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;
}
}
}
最新文章
- Android 实时监测(监听)网络连接状态变化
- LoadRunner error -27979
- Ubuntu Server 中resolv.conf重启时被覆盖的问题
- 【转】SQL删除重复数据方法
- Block介绍(二)内存管理与其他特性
- 再看C
- NET版微信客户端.
- Python:学会创建并调用函数
- Java IO流--练习2
- Docker实例:创建一个点到点连接
- 在IDEA中设置命令行参数
- bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)
- Trailing slash
- 搭建前端监控系统(二)JS错误监控篇
- python---不支持中文注释解决办法
- [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]
- exception javax.crypto.BadPaddingException: Given final block not properly padded
- angularJS中的MVC思想?
- 用 free 或 delete 释放了内存之后,立即将指针设置为 NULL,防止产 生“野指针”
- GET和POST请求的区别如下
热门文章
- 轻松应对并发,Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单
- [PyTorch 学习笔记] 2.2 图片预处理 transforms 模块机制
- Micro-CMS v1	(Hacker101 CTF)
- C# Chart各个属性详细解析、应用
- java初探(1)之秒杀的安全
- [BUUOJ记录] [BJDCTF2020]The mystery of ip
- FIddlerd的下载教程和使用教程
- Agumater 增加基本数据上传下载能力
- python pickle库
- Spring的循环依赖,学就完事了【附源码】