📜  Java中的 DelayQueue size() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:01:52.805000             🧑  作者: Mango

Java中的 DelayQueue size() 方法及示例

DelayQueue简介

DelayQueue是一个有序队列,其中每个元素都有一个过期时间。当从队列中获取元素时,只有过期时间到了的元素才能被取出。DelayQueue是线程安全的。

size()方法

DelayQueue中的size()方法用于返回队列中元素的数量,也就是还没过期的元素数量。该方法的时间复杂度为O(1)。

示例

以下是一个使用DelayQueue的示例代码,其中包括了size()方法的使用:

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

public class DelayQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();
        delayQueue.add(new DelayedTask("Task 1", 5, TimeUnit.SECONDS));
        delayQueue.add(new DelayedTask("Task 2", 2, TimeUnit.SECONDS));
        delayQueue.add(new DelayedTask("Task 3", 3, TimeUnit.SECONDS));
        System.out.println("DelayQueue size before poll: " + delayQueue.size()); // 3
        System.out.println("Task 2 before poll: " + delayQueue.contains(new DelayedTask("Task 2", 0, TimeUnit.SECONDS))); // false
        Thread.sleep(5000); // Wait for Task 1 to expire
        System.out.println("DelayQueue size after waiting for Task 1 to expire: " + delayQueue.size()); // 2
        System.out.println("Task 2 after waiting for Task 1 to expire: " + delayQueue.contains(new DelayedTask("Task 2", 0, TimeUnit.SECONDS))); // true
        while (!delayQueue.isEmpty()) {
            System.out.println(delayQueue.poll().getName() + " has been executed.");
        }
        System.out.println("DelayQueue size after poll: " + delayQueue.size()); // 0
    }
}

class DelayedTask implements Delayed {
    private String name;
    private long expiryTime;

    public DelayedTask(String name, long delay, TimeUnit timeUnit) {
        this.name = name;
        this.expiryTime = System.currentTimeMillis() + timeUnit.toMillis(delay);
    }

    public String getName() {
        return name;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(expiryTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        return Long.compare(expiryTime, ((DelayedTask) o).expiryTime);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof DelayedTask) {
            return this.name.equals(((DelayedTask) obj).name);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }
}

在上述示例代码中,DelayQueueDemo类包含了main方法,使用了DelayQueueDelayedTask类。首先向队列中添加了三个DelayedTask对象,其中Task 1的过期时间为5秒,Task 2的过期时间为2秒,Task 3的过期时间为3秒。 然后调用了size()方法并输出结果,期望值为3。 接下来对Task 2进行了查询操作,期望返回结果为false。然后通过Thread.sleep(5000)方法等待了5秒钟,以等待Task 1过期。调用size()方法并输出结果,期望值为2,并对Task 2再次进行查询操作,期望返回结果为true。最后通过循环调用poll()方法逐一取出已经过期的元素,调用size()方法并输出结果,期望值为0。

以上就是Java中的DelayQueue size()方法及示例的介绍。