java delayed实例_Java延迟队列原理与用法实例详解

本文详细介绍了Java延迟队列的工作原理和使用方法,包括创建消息体、消费者和延迟队列的实现。通过示例代码展示了如何使用DelayQueue实现延时任务,如延时3秒和10秒的消息消费。此外,还探讨了在实际项目中的应用,如打车软件的订单派单场景,并给出了具体的项目实现框架,包括任务类、消息体类和延迟队列管理类。文章最后提到,Java的DelayQueue在服务宕机时可能会导致任务丢失,因此建议考虑使用MQ或Redis等其他方案来提高可靠性。
摘要由CSDN通过智能技术生成

本文实例讲述了Java延迟队列原理与用法。分享给大家供大家参考,具体如下:

延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到……

应用场景比较多,比如延时1分钟发短信,延时1分钟再次执行等,下面先看看延时队列demo之后再看延时队列在项目中的使用:

简单的延时队列要有三部分:第一实现了Delayed接口的消息体、第二消费消息的消费者、第三存放消息的延时队列,那下面就来看看延时队列demo。

一、消息体

package com.delqueue;

import java.util.concurrent.Delayed;

import java.util.concurrent.TimeUnit;

/**

* 消息体定义 实现Delayed接口就是实现两个方法即compareTo 和 getDelay最重要的就是getDelay方法,这个方法用来判断是否到期……

*

* @author whd

* @date 2017年9月24日 下午8:57:14

*/

public class Message implements Delayed {

private int id;

private String body; // 消息内容

private long excuteTime;// 延迟时长,这个是必须的属性因为要按照这个判断延时时长。

public int getId() {

return id;

}

public String getBody() {

return body;

}

public long getExcuteTime() {

return excuteTime;

}

public Message(int id, String body, long delayTime) {

this.id = id;

this.body = body;

this.excuteTime = TimeUnit.NANOSECONDS.convert(delayTime, TimeUnit.MILLISECONDS) + System.nanoTime();

}

// 自定义实现比较方法返回 1 0 -1三个参数

@Override

public int compareTo(Delayed delayed) {

Message msg = (Message) delayed;

return Integer.valueOf(this.id) > Integer.valueOf(msg.id) ? 1

: (Integer.valueOf(this.id) < Integer.valueOf(msg.id) ? -1 : 0);

}

// 延迟任务是否到时就是按照这个方法判断如果返回的是负数则说明到期否则还没到期

@Override

public long getDelay(TimeUnit unit) {

return unit.convert(this.excuteTime - System.nanoTime(), TimeUnit.NANOSECONDS);

}

}

二、消息消费者

package com.delqueue;

import java.util.concurrent.DelayQueue;

public class Consumer implements Runnable {

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值