《架构风清扬-Java面试系列第29讲》聊聊DelayQueue的使用场景

DelayQueue是BlockingQueue接口的一个实现类之一

这个属于基础性问题,老规矩,我们将从使用场景和代码示例来进行讲解

来,思考片刻,给出你的答案

1,使用场景

  1. 实现:延迟队列,其中元素只有在其预定时间到达后才可以从队列中取出。
  2. 场景:适用于延时任务调度,如定时任务、缓存失效处理等。

2,代码示例

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

class DelayedItem implements Delayed {
    private long delayTime; // 延迟时间
    private long insertionTime; // 加入队列的时间

    public DelayedItem(long delay, TimeUnit unit) {
        this.delayTime = unit.toNanos(delay);
        this.insertionTime = System.nanoTime();
    }

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

    @Override
    public int compareTo(Delayed o) {
        if (this == o)
            return 0;
        long diff = (getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS));
        return (diff == 0) ? 0 : ((diff < 0) ? -1 : 1);
    }

    @Override
    public String toString() {
        return "DelayedItem";
    }
}

public class DelayQueueExample {
    static final DelayQueue<DelayedItem> queue = new DelayQueue<>();

    public static void main(String[] args) throws InterruptedException {
        queue.put(new DelayedItem(5, TimeUnit.SECONDS));

        Thread consumer = new Thread(() -> {
            try {
                DelayedItem delayedItem = queue.take(); // 只有延迟时间到了才能取出
                System.out.println("Consumed after delay: " + delayedItem);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        consumer.start();

        // 等待consumer完成
        consumer.join();
    }
}

至此,关于BlockingQueue接口的关键实现类也给大伙介绍完毕了

想系统性学习更多进阶的内容,欢迎来加入我的星球

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值