DelayQueue 订单限时支付实例

1.订单实体

package com.zy.entity;

import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class Order implements Delayed {

    String id;
    String name;// 订单名称
    Date creatTime;// 创建时间
    int seconds; // 有效期n秒
    Date endTime;// 过期时间

    public Order(String id, String name, Date creatTime, int seconds) {
        super();
        this.id = id;
        this.name = name;
        this.creatTime = creatTime;
        this.seconds = seconds;
        this.endTime = new Date(creatTime.getTime() + seconds * 1000);// 过期时间
    }

    // 排序(插入时根据这个方法排序)
    @Override
    public int compareTo(Delayed o) {
        Order order = (Order) o;
        return this.seconds - order.seconds > 0 ? 1 : (this.seconds - order.seconds < 0 ? -1 : 0);
    }

    // 激活日期的剩余时间,时间单位由单位参数指定
    @Override
    public long getDelay(TimeUnit unit) {
        long l = this.getEndTime().getTime() - System.currentTimeMillis();
        return unit.convert(l,TimeUnit.MILLISECONDS);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    public int getSeconds() {
        return seconds;
    }

    public void setSeconds(int seconds) {
        this.seconds = seconds;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

}

 

 

2.下订单

 
 
package com.zy.service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Stack;
import java.util.concurrent.DelayQueue;

import com.zy.entity.Order;

public class OrderService implements Runnable {
    // delay队列(先进先出)
    DelayQueue<Order> queue = new DelayQueue<Order>();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    // 添加订单(向队列中添加数据)
    public void insertOder(Order order) {
        System.out.println("向队列中添加订单(" + order.getName() + ")。。。。添加时间(" + sdf.format(order.getCreatTime()) + ")。。。。。"
                + "过期时间:" + sdf.format(order.getEndTime()));
        queue.put(order);
    }

    // 订单过期时间
    @Override
    public void run() {
        while (true) {
            System.out.println("检查");
            try {
                Order order = queue.take();// 当队列取出为空时,线程堵塞
                if (order != null) {
                    System.out.println(order.getName() + "订单支付时间过期" + sdf.format(new Date()));
                } else {
                    System.out.println("无过期订单");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        // 启动线程
        OrderService orderService = new OrderService();
        new Thread(orderService).start();
        // 项队列中添加数据
        Order order1 = new Order("1", "订单一", new Date(), 50);
        Order order2 = new Order("2", "订单2", new Date(), 30);
        Order order3 = new Order("1", "订单3", new Date(), 40);
        orderService.insertOder(order1);
        orderService.insertOder(order2);
        orderService.insertOder(order3);
        Thread.currentThread().sleep(35000);
        Order order4 = new Order("4", "订单4", new Date(), 10);
        orderService.insertOder(order4);

    }
}
 
 

 

3:结果

 



 

转载于:https://www.cnblogs.com/zy-jiayou/p/10571559.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值