import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
* @author James.Ge
* @description
* @date 2025-09-28
*/
public class DelayQueueDemo {
static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws InterruptedException {
DelayQueue<DelayedTask> queue = new DelayQueue<>();
// 添加3个延迟任务
queue.put(new DelayedTask("Task-1", 5, TimeUnit.SECONDS));
queue.put(new DelayedTask("Task-2", 10, TimeUnit.SECONDS));
queue.put(new DelayedTask("Task-3", 15, TimeUnit.SECONDS));
System.out.println("开始时间: " + LocalDateTime.now().format(formatter));
while (!queue.isEmpty()) {
DelayedTask task = queue.take();
System.out.println("执行: " + task + " 当前时间: " + LocalDateTime.now().format(formatter));
}
}
}
class DelayedTask implements Delayed {
private final String taskName;
private final LocalDateTime executeTime;
public DelayedTask(String taskName, long delay, TimeUnit unit) {
this.taskName = taskName;
this.executeTime = LocalDateTime.now().plus(delay, unit.toChronoUnit());
// this.executeTime = System.currentTimeMillis() + unit.toMillis(delay);
}
@Override
public long getDelay(TimeUnit unit) {
// return unit.convert(executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
LocalDateTime minus = executeTime.minus(System.currentTimeMillis(), TimeUnit.MILLISECONDS.toChronoUnit());
long timestamp = minus
.toInstant(ZoneOffset.of("+8"))
.toEpochMilli();
return unit.convert(timestamp, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
long epochMilli0 = this.executeTime.toInstant(ZoneOffset.of("+8"))
.toEpochMilli();
long epochMilli1 = ((DelayedTask) o).executeTime.toInstant(ZoneOffset.of("+8"))
.toEpochMilli();
return Long.compare(epochMilli0, epochMilli1);
}
@Override
public String toString() {
return "Task: " + taskName + " (Execute at: " + executeTime.format(DelayQueueDemo.formatter) + ")";
}
}