📅  最后修改于: 2023-12-03 15:31:56.920000             🧑  作者: Mango
在Java中,DelayQueue是一个实现了Delayed接口的无界阻塞队列,它内部使用优先队列(PriorityQueue)实现。在DelayQueue中,只有延迟期限到期的元素才能被取出,否则取出操作会一直阻塞。clear()方法是DelayQueue提供的一种用于清除所有元素的方法。
public void clear()
该方法用于从DelayQueue中移除所有元素。此操作会使DelayQueue变为空队列。
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();
delayQueue.offer(new DelayedTask("Task 1", 5, TimeUnit.SECONDS));
delayQueue.offer(new DelayedTask("Task 2", 10, TimeUnit.SECONDS));
delayQueue.offer(new DelayedTask("Task 3", 15, TimeUnit.SECONDS));
System.out.println("Before clear()");
delayQueue.forEach(System.out::println); // 输出当前队列中的元素
delayQueue.clear(); // 清空队列
System.out.println("After clear()");
delayQueue.forEach(System.out::println); // 输出当前队列中的元素
}
}
class DelayedTask implements Delayed {
private final String taskName;
private final long delay;
private final long expire;
public DelayedTask(String taskName, long delay, TimeUnit unit) {
this.taskName = taskName;
this.delay = unit.toNanos(delay);
this.expire = System.nanoTime() + this.delay;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(expire - System.nanoTime(), TimeUnit.NANOSECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(expire, ((DelayedTask)o).expire);
}
@Override
public String toString() {
return "DelayedTask{" +
"taskName='" + taskName + '\'' +
", delay=" + delay +
", expire=" + expire +
'}';
}
}
在上面的例子中,我们通过向DelayQueue中添加三个DelayedTask对象,分别表示延迟5秒、10秒和15秒,然后使用clear()方法清空这个队列。在输出队列元素之前和之后,我们可以看到队列中是否还有剩余的元素。输出结果如下:
Before clear()
DelayedTask{taskName='Task 1', delay=5000000000, expire=340230066943225}
DelayedTask{taskName='Task 2', delay=10000000000, expire=340230116954597}
DelayedTask{taskName='Task 3', delay=15000000000, expire=340230166964947}
After clear()
在调用clear()方法之后,队列中的所有元素都被成功地清除了。