java 自定义消息队列_Java基础——消息队列

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

2、使用Queue实现消息对列

双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取

阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行,比如当添加元素时,如果队列元素已满,队列则会阻塞等待直到有空位时再插入

非阻塞队列,和阻塞队列相反,它会直接返回操作的结果,而非阻塞等待操作,双端队列也属于非阻塞队列

//定义消息队列

private static Queue 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) 

return -1;

} else {

return 0;

}

}

@Override

public String toString() {

return this.msg;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值