Java线程队列的使用-DelayQueue

DelayQueue是一种延迟队列,它的元素必须实现Delayed接口,该接口定义了一个getDelay方法,用于返回元素的剩余延迟时间。DelayQueue会根据元素的延迟时间排序,只有当元素的延迟时间为0或负数时,才能从队列中获取。

DelayQueue可以用于实现定时任务、缓存过期等场景。例如,下面的代码创建了一个DelayQueue,并向其中添加了四个元素,每个元素有不同的延迟时间。然后从队列中循环获取元素,并打印出来。

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

// 定义一个延迟任务类,实现Delayed接口
class DelayTask implements Delayed {
    // 任务名称
    private String name;
    // 任务执行时间(毫秒)
    private long executeTime;

    // 构造方法,传入任务名称和延迟时间(秒)
    public DelayTask(String name, long delay) {
        this.name = name;
        // 将延迟时间转换为执行时间
        this.executeTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(delay);
    }

    @Override
    public long getDelay(TimeUnit unit) {
        // 返回剩余延迟时间
        return unit.convert(executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        // 比较剩余延迟时间
        return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
    }

    @Override
    public String toString() {
        return "DelayTask{" +
                "name='" + name + '\'' +
                ", executeTime=" + executeTime +
                '}';
    }
}

public class DelayQueueDemo {
    public static void main(String[] args) {
        // 创建一个延迟队列
        DelayQueue<DelayTask> dq = new DelayQueue<>();
        // 向队列中添加四个元素,注意它们的延迟时间
        dq.offer(new DelayTask("task1", 5));
        dq.offer(new DelayTask("task2", 2));
        dq.offer(new DelayTask("task3", 7));
        dq.offer(new DelayTask("task4", 3));
        // 从队列中循环获取元素,并打印出来
        while (dq.size() > 0) {
            try {
                System.out.println(dq.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

输出结果:

DelayTask{name='task2', executeTime=1645185003739}
DelayTask{name='task4', executeTime=1645185005739}
DelayTask{name='task1', executeTime=1645185007739}
DelayTask{name='task3', executeTime=1645185011739}

可以看到,队列中的元素按照延迟时间的顺序被获取,即先获取延迟时间最短的元素,后获取延迟时间最长的元素。

猜你喜欢

转载自blog.csdn.net/caicai250/article/details/131441266