JAVA 延时队列

xiaoxiao2021-02-28  114

/** * Created by yl on 2017/7/10. */ public class Message implements Delayed{ private int id; private String msg; private long excuteTime; public Message(int id, String msg, long excuteTime) { this.id = id; this.msg = msg; this.excuteTime = excuteTime; } public int getId() { return id; } public void setId(int id) { this.id = id; } public long getExcuteTime() { return excuteTime; } public void setExcuteTime(long excuteTime) { this.excuteTime = excuteTime; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } @Override public long getDelay(TimeUnit unit) { return unit.convert(this.excuteTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } @Override public int compareTo(Delayed o) { return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS)); } }

队列操作:

/** * Created by yl on 2017/7/10. */ public class MessageDelayQueue { private MessageDelayQueue(){ } private static DelayQueue<Message> queue = new DelayQueue<Message>(); /*新增延时队列*/ public static void addMessage(Message msg){ queue.offer(msg); } /*移除延时队列*/ public static void rmMessage(Message msg){ queue.remove(msg); } public static DelayQueue<Message> getQueue() { return queue; } public static void setQueue(DelayQueue<Message> queue) { MessageDelayQueue.queue = queue; } }

线程执行类

/** * Created by yl on 2017/7/10. */ public class DelayQueueThread implements Runnable { @Override public void run() { while(true) { try { Message take = MessageDelayQueue.getQueue().take(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(String.format("消息执行,msg:[%s],id:[%s],执行时间:[%s]", take.getMsg(), take.getId(), sdf.format(take.getExcuteTime()))); } catch (InterruptedException e) { e.printStackTrace(); } } } }

测试类

public class Test { public static void main(String[] args) { MessageDelayQueue.addMessage(new Message(1,"消息1",getTime(15000))); MessageDelayQueue.addMessage(new Message(2,"消息2",getTime(30000))); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(String.format("启动延时任务[%s]",sdf.format(System.currentTimeMillis()))); new Thread(new DelayQueueThread()).start(); MessageDelayQueue.addMessage(new Message(3,"消息3",getTime(70000))); MessageDelayQueue.addMessage(new Message(4,"消息4",getTime(45000))); } public static long getTime(int s){ return new Date().getTime() + s; } }

最终结果分别15、30、45、70秒后执行:

启动延时任务[2017-07-10 13:43:04] 消息执行,msg:[消息1],id:[1],执行时间:[2017-07-10 13:43:19] 消息执行,msg:[消息2],id:[2],执行时间:[2017-07-10 13:43:34] 消息执行,msg:[消息4],id:[4],执行时间:[2017-07-10 13:43:49] 消息执行,msg:[消息3],id:[3],执行时间:[2017-07-10 13:44:14]
转载请注明原文地址: https://www.6miu.com/read-31692.html

最新回复(0)