版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38336658/article/details/81624798
延时任务:可以使用DelayQueue队列来进行实现
写一个类实现Delayed这个接口,然后复写里面的2个方法
/*
* 获取延时时间
*/
@Override
public long getDelay(TimeUnit unit) {
return endtime-System.currentTimeMillis();
}
getDelay是获取延迟的时间,按ms算的,也就是设置延时多久执行的时间,至于endtime看下面完整的代码
@Override
public int compareTo(Delayed o) {
MYDelayed s = (MYDelayed)o;
if (this.endtime > s.endtime) {
return 1;
}else if (this.endtime == s.endtime) {
return 0;
}else {
return -1;
}
}
这个是比较队列里面先后顺序,比它晚玩完的返回1,一样的为0,慢的是-1
有几个注意的:
1.DelayQueue这个队列,take()方法会阻塞,如果你拿不到对象的话。poll()方法不会阻塞,你拿不到就是null
2.
System.currentTimeMillis()这个是按ms来算的,那么如何秒转ms,看下面,坑了我很久
TimeUnit.MILLISECONDS.convert(endtime, TimeUnit.SECONDS)
完整的代码:
package com.example.demo;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
import java.util.UUID;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class MYDelayed implements Delayed{
//任务超时时间戳
private long endtime;
//物品id
public String getPid() {
return pid;
}
private String pid;
/*
* 获取延时时间
*/
@Override
public long getDelay(TimeUnit unit) {
return endtime-System.currentTimeMillis();
}
@Override
public int compareTo(Delayed o) {
MYDelayed s = (MYDelayed)o;
if (this.endtime > s.endtime) {
return 1;
}else if (this.endtime == s.endtime) {
return 0;
}else {
return -1;
}
}
MYDelayed(long endtime,String pid){
this.endtime=System.currentTimeMillis()+TimeUnit.MILLISECONDS.convert(endtime, TimeUnit.SECONDS);
System.out.println(this.endtime);
this.pid=pid;
}
public static void main(String[] args) {
DelayQueue<MYDelayed> delayedDelayQueue;
delayedDelayQueue=new DelayQueue<MYDelayed>();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 6; i++) {
MYDelayed myDelayed = new MYDelayed(5, "1000"+i);
delayedDelayQueue.add(myDelayed);
System.out.println(LocalTime.now() + "插入" +myDelayed.getPid());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
MYDelayed myDelayed1=null;
try {
myDelayed1=delayedDelayQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(myDelayed1!=null){
System.out.println(LocalTime.now()+"收到:"+myDelayed1.getPid());
}else {
try {
System.out.println("尝试获取中。。。");
Thread.sleep(100);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}).start();
}
}