Java 延迟队列有对立面吗?

Java 延迟队列有对立面吗?,java,queue,Java,Queue,我需要一个队列来自动删除超过给定毫秒数的元素——基本上,我希望队列中的项目在一段时间后过期 我看到有一个延迟队列似乎做了相反的事情:“一个元素只有在其延迟过期时才能使用。”(我从未使用过它) 也许有一个队列实现可以满足我的需要?如果它是有界的就更好了。我想在java中不是这样的本机实现,我不确定。但是你可以用一个缓存来保存这种情况,不确定这是否是最好的方法,但是你可以使用谷歌番石榴,为你的iTen设置一个过期时间,这样你就只能恢复那些没有过期的值 以下是google guava缓存实现的文档:

我需要一个队列来自动删除超过给定毫秒数的元素——基本上,我希望队列中的项目在一段时间后过期

我看到有一个延迟队列似乎做了相反的事情:“一个元素只有在其延迟过期时才能使用。”(我从未使用过它)


也许有一个队列实现可以满足我的需要?如果它是有界的就更好了。

我想在java中不是这样的本机实现,我不确定。但是你可以用一个缓存来保存这种情况,不确定这是否是最好的方法,但是你可以使用谷歌番石榴,为你的iTen设置一个过期时间,这样你就只能恢复那些没有过期的值

以下是google guava缓存实现的文档:


希望有帮助

如果要删除过期对象,需要一个DelayQueue和一个线程,该线程将从中提取过期对象,如下所示:

static class Wrapper<E> implements Delayed {
    E target;
    long exp = System.currentTimeMillis() + 5000; // 5000 ms delay

    Wrapper(E target) {
        this.target = target;
    }

    E get() {
        return target;
    }

    @Override
    public int compareTo(Delayed o) {
        return 0;
    }

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


public static void main(String[] args) throws Exception {
    final DelayQueue<Wrapper<Integer>> q = new DelayQueue<>();
    q.add(new Wrapper<>(1));
    Thread.sleep(3000);
    q.add(new Wrapper<>(2));

    new Thread() {
        public void run() {
            try {
                for(;;) {
                    Wrapper<Integer> w = q.take();
                    System.out.println(w.get());
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        };
    }.start();
}
静态类包装器实现延迟{
E目标;
long exp=System.currentTimeMillis()+5000;//5000毫秒延迟
包装器(E目标){
this.target=目标;
}
E get(){
回报目标;
}
@凌驾
公共内部比较(延迟o){
返回0;
}
@凌驾
公共长getDelay(时间单位){
返回unit.convert(exp-System.currentTimeMillis(),TimeUnit.millists);
}
}
公共静态void main(字符串[]args)引发异常{
final DelayQueue q=新的DelayQueue();
q、 添加(新包装(1));
睡眠(3000);
q、 添加(新包装(2));
新线程(){
公开募捐{
试一试{
对于(;;){
包装w=q.take();
System.out.println(w.get());
}
}捕捉(中断异常e){
抛出新的运行时异常(e);
}
};
}.start();
}
问题在于谁以及在什么时候删除过期的元素。如果您关心的是队列的大小没有超过一定的限制,那么您必须有一个单独的“更干净”线程,在队列过期时从队列中删除内容。您可以使用
DelayQueue
offer
将添加到内部
LinkedHashSet
DelayQueue
poll
对集合进行操作,另外还有一个更干净的线程轮询
DelayQueue
,并在它们“成熟”时从集合中删除内容)


如果您不太关心项目在到期后立即从队列中删除,那么您可以覆盖标准队列的
poll
方法,检查标头的过期情况,如果标头过期,则清除队列的其余部分并返回null。

如果我向队列中添加了更多元素,这将无法正常工作。q、 添加(新包装(1));睡眠(1000);q、 添加(新包装(2));睡眠(1000);q、 添加(新包装(1));睡眠(1000);q、 添加(新包装(2));