DelayQueue 有相反的东西吗?
Is there an opposite for the DelayQueue?
我需要一个队列来自动删除早于给定毫秒数的元素 - 基本上,我希望队列中的项目在一段时间后过期。
我看到有一个延迟队列似乎在做相反的事情:'an element can only be taken when its delay has expired.'(我从来没有用过)。
也许有一个队列实现可以满足我的需要?如果有界就更好了
我想这不是像 java 中那样的本机实现,我不确定。但是你可以用缓存来处理这种情况,不确定这是否是最好的方法,但是你可以为此使用 google 番石榴,为你的 itens 设置一个过期时间,这样你就只会恢复不是的值已过期。
这里是 google 番石榴缓存实现的文档:Guava Doc
希望对您有所帮助!
如果你想删除过期的对象,你需要一个 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();
}
问题在于who,此时将删除已过期的元素。如果您担心队列的大小不会超过一定的限制,您将不得不有一个单独的 "cleaner" 线程,在它们过期时从队列中删除它们。您可以使用 DelayQueue
实现它(offer
将添加到内部 LinkedHashSet
和 DelayQueue
,poll
对集合进行操作,另外还有一个更干净的线程轮询 DelayQueue
,并在 "ripen") 时从集合中删除内容。
如果你不太关心项目一过期就从队列中删除,你可以覆盖标准队列的 poll
方法,检查头部的过期时间,并且,如果它已过期,则清除队列的其余部分和 return null.
我需要一个队列来自动删除早于给定毫秒数的元素 - 基本上,我希望队列中的项目在一段时间后过期。
我看到有一个延迟队列似乎在做相反的事情:'an element can only be taken when its delay has expired.'(我从来没有用过)。
也许有一个队列实现可以满足我的需要?如果有界就更好了
我想这不是像 java 中那样的本机实现,我不确定。但是你可以用缓存来处理这种情况,不确定这是否是最好的方法,但是你可以为此使用 google 番石榴,为你的 itens 设置一个过期时间,这样你就只会恢复不是的值已过期。
这里是 google 番石榴缓存实现的文档:Guava Doc
希望对您有所帮助!
如果你想删除过期的对象,你需要一个 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();
}
问题在于who,此时将删除已过期的元素。如果您担心队列的大小不会超过一定的限制,您将不得不有一个单独的 "cleaner" 线程,在它们过期时从队列中删除它们。您可以使用 DelayQueue
实现它(offer
将添加到内部 LinkedHashSet
和 DelayQueue
,poll
对集合进行操作,另外还有一个更干净的线程轮询 DelayQueue
,并在 "ripen") 时从集合中删除内容。
如果你不太关心项目一过期就从队列中删除,你可以覆盖标准队列的 poll
方法,检查头部的过期时间,并且,如果它已过期,则清除队列的其余部分和 return null.