0
点赞
收藏
分享

微信扫一扫

延时队列`DelayQueue`

代码

package com.koala.learn.charter1;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

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

/**
* @Description TODO
* @Date 2022/2/26 12:18
* @Created by koala
*/
@AllArgsConstructor
@NoArgsConstructor
class DelayElements implements Delayed {

private String key;

// 存活时间
private long aliveTime;
// 过期时间
private long timeOut;

public long getTimeOut() {
return timeOut;
}

public void setTimeOut(long timeOut) {
this.timeOut = timeOut;
}

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public long getAliveTime() {
return aliveTime;
}

public void setAliveTime(long aliveTime) {
this.aliveTime = aliveTime;
}

public DelayElements(String key, long aliveTime) {
super();
this.key = key;
this.aliveTime = aliveTime;
this.timeOut = TimeUnit.NANOSECONDS.convert(aliveTime, TimeUnit.SECONDS) + System.nanoTime();
}

@Override
public int compareTo(Delayed o) {
if (o == null)
return 1;
if (o == this)
return 0;
if (o instanceof DelayElements) {
DelayElements de = (DelayElements) o;
if (this.timeOut > de.getTimeOut()) {
return 1;
} else if (this.timeOut < de.getTimeOut()) {
return -1;
}
}
return 0;
}

@Override
public long getDelay(TimeUnit unit) {
return unit.convert(timeOut - System.nanoTime(), TimeUnit.NANOSECONDS);
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DelayElements other = (DelayElements) obj;
if (key == null) {
if (other.key != null)
return false;
} else if (!key.equals(other.key))
return false;
return true;
}

}
package com.koala.learn.charter1;

import org.junit.jupiter.api.Test;

import java.util.concurrent.DelayQueue;

/**
* 学习延时队列
* 每隔十分钟就给思甜发一个消息
* @Date 2022/2/26 12:04
* @Created by koala
*/

public class Info {

public static void main(String[] args) throws InterruptedException {
DelayQueue<DelayElements> delayQueue = new DelayQueue();
// 创建消息内容
String msg = "你好 sitian";
delayQueue.offer(new DelayElements(msg,1));
delayQueue.offer(new DelayElements(msg,3));
delayQueue.offer(new DelayElements(msg,5));
while(!delayQueue.isEmpty()){
DelayElements poll = delayQueue.take();
System.out.println(poll.getKey());
}
}

}

思想

建立一个任务 设置定时时间 放入队列

取任务每次取最近的任务

触发

工作上遇到建立了checklist 任务 博客在完成了checklist 任务

作用

能够用来处理延时任务

如把衣服放到洗衣机过了段时间才过来处理等任务


举报

相关推荐

0 条评论