DelayQueue有相反的意思吗?

时间:2015-04-01 13:11:35

标签: java queue

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

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

也许有一个队列实现可以满足我的需求?如果有界限会更好。

3 个答案:

答案 0 :(得分:1)

如果你想删除过期的对象,你需要一个DelayQueue和一个Thread,它将从中提取过期的对象,如下所示:

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();
}

答案 1 :(得分:1)

问题是此时将删除已过期的元素。如果您关注的是队列的大小没有超出一定限度,那么您将需要一个单独的“清洁”&#34;线程,在队列过期时将其从队列中删除。您可以使用DelayQueue来实现它(offer将添加到内部LinkedHashSetDelayQueuepoll对该集合进行操作,另外还有一个更干净的线程轮询DelayQueue,并从集合中移除内容,因为它们成熟了#34;)。

如果您对过期后从队列中删除的项目不太关心,您可以覆盖标准队列的poll方法,检查头部的过期,以及如果已过期,则清除队列的其余部分并返回null。

答案 2 :(得分:0)

我想我不是像java那样的原生实现,我不确定。但你可以通过缓存来控制这种情况,不确定它是否是最好的approuch,但是你可以使用google guava,为你的itens设置一个到期时间,这样你只能恢复不是的值。过期。

以下是google guava缓存实施的文档:Guava Doc

希望它有所帮助!