- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下据称非常简单的 DelayQueue 演示.
class DelayedThing implements Delayed {
private final long waitUntil;
private final String name;
public DelayedThing(String name, long wait) {
this.name = name;
this.waitUntil = System.currentTimeMillis() + wait;
System.out.println("DelayedThing(" + name + " wait=" + wait + " until-" + waitUntil);
}
@Override
public long getDelay(TimeUnit unit) {
System.out.println(name + " getDelay = " + unit.convert(waitUntil - System.currentTimeMillis(), TimeUnit.MILLISECONDS));
return unit.convert(waitUntil - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
long diff = this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);
System.out.println(name + ".compareTo(" + o + ") = " + diff);
return Long.signum(diff);
}
@Override
public String toString() {
return name;
}
}
public void test() throws InterruptedException {
BlockingQueue<Delayed> queue = new DelayQueue<>();
queue.add(new DelayedThing("one second", 1000));
queue.add(new DelayedThing("two seconds", 2000));
queue.add(new DelayedThing("half second", 500));
for (Delayed d : queue) {
System.out.println(d);
}
}
但是它打印
half second
two seconds
one second
这显然是错误的。
最佳答案
这个错误很微妙。我假设 DelayQueue
的 iterator
将对每个元素执行一系列 take
调用。 错了!
参见 iterator() Java文档:
Returns an iterator over all the elements (both expired and unexpired) in this queue.
这是出乎意料的。
一个正确的解决方案如下:
while (queue.size() > 0) {
System.out.println(queue.take());
}
请注意,如果您尝试流式传输队列,也会发生此问题:
queue.stream().forEach((d) -> {
System.out.println(d);
});
由于流式传输将发生在 DelayQueue
提供的iterator
上,这也会产生意想不到的结果。
关于java - 为什么我的 DelayQueue 没有延迟并以错误的顺序打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206562/
我需要一个队列来自动删除早于给定毫秒数的元素 - 基本上,我希望队列中的项目在一段时间后过期。 我看到有一个延迟队列似乎在做相反的事情:“一个元素只能在其延迟到期时被采用。” (我从未使用过它)。 也
在 Java 7 中,DelayQueue 的实现使用了没有公平策略的 ReentrantLock。从长远来看,这是一个问题吗?线程会因此而饿死吗? 谢谢 最佳答案 如果您考虑 ScheduledTh
我遇到了与作者类似的问题: DelayQueue with higher speed remove()? 问题:我需要处理连续传入的数据并检查数据是否在之前的某个时间范围内被看到过。因此,我计算传入数
我有以下据称非常简单的 DelayQueue 演示. class DelayedThing implements Delayed { private final long waitUntil;
我刚开始用 java 编码,我正在努力设置 DelayQueue, 我想这样, DelayQueue queue = new DelayQueue(); If (counter > 0){ queue
我将在模拟 parking 场的程序中使用 Collections 接口(interface)中的 DelayQueue。我想知道在没有元素过期的情况下是否有多个 take 方法调用队列,最后一个 t
下面的 java 代码示例使用 java DelayQueue 来处理任务。然而,从另一个线程插入任务似乎会破坏(我的)预期行为。 很抱歉代码示例太长,但总而言之: 主线程将 5 个任务 (A-E)
我正在使用 LinkedBlockingQueue 队列来实现用于 TCP/IP 事件传输的生产者-消费者模式,我正在使用 boolean offer(e)这意味着一旦队列达到其容量,新传入的事件将被
我正在尝试创建一个 ThreadPoolExecutor: // Thingy implements Delayed and Runnable ExecutorService executor = n
我想要一个DelayQueue计划的 Runnable 的数量,其中每个 Runnable 只能在预先指定的某个时间点之后运行。因此,线程可以继续从该队列中删除可运行对象并处理事件计划。为什么 Del
我想遍历我的 DelayQueue 中未过期的元素。类Transaction实现了Delayed,有一个字段timestamp,代表一笔交易发起时的UTC时间戳(不是当前时间戳) public cla
我是一名优秀的程序员,十分优秀!