- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个专用于执行异步任务的线程池,使用共享的 DelayQueue。
基本上,一切正常,除了一件事:我希望能够推迟执行一些已经安排好的任务。例如,假设我现在在时间 t=0 提交一个要在 30 秒内执行的任务。 10 秒后 (t=10),我决定,哦不,该任务不会在 t=30 执行,而是在 t=50;因此,我将其推迟到 20 秒后。
为此,我有 postpone 方法,它修改为任务设置的时间,从而更改 getDelay 的返回值。代码在本文末尾。
不幸的是,它不起作用。实际上很容易破坏系统并使过期元素保留在队列中,比它们通常应该保留的时间长得多。更具体地说,我观察到以下不良行为:
我还注意到,如果任务在进入队列时从未成为头,我可以安全地推迟它,即不会干扰其他任务。
所以,我的问题是:
感谢您的回答。
这是代码。我已经尽可能多地删除了不相关的部分。我特别删除了所有异常处理。
public abstract class AbstractTaskExecutor<R extends Runnable> implements Runnable {
private final BlockingQueue<R> q;
...
public boolean submit (R dr) { return q.add(dr); }
public void run () {
while (!Thread.currentThread().isInterrupted()) {
Runnable r = q.poll(30, TimeUnit.SECONDS);
if (r!=null) r.run();
}}
}
public abstract class DelayedRunnable implements Runnable, Delayed {
private long time;
public DelayedRunnable (long l) {
time = System.currentTimeMillis() +l;
}
public final int compareTo (Delayed d) {
return (int)( Math.min(Math.max(Integer.MIN_VALUE, time - ((DelayedRunnable)d).time), Integer.MAX_VALUE) );
}
public final long getDelay (TimeUnit t) {
return t.convert(time - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
public final long getTime () { return time; }
public void postpone (long l) { time+=l; }
}
public class DelayedTaskExecutor extends AbstractTaskExecutor<DelayedRunnable> {
...
}
最佳答案
A question remains though: is it possible to reschedule the object that was just cancelled
如果您所做的只是更改“激活”的时间,则不是。您必须删除它,更改它并重新添加它,因为它可能在数据结构中的位置不同。这是必需的,因为结构决定了事件的顺序,如果您只是更改值,这可能会或可能不会导致顺序更改。如果在添加后更改 Map 的键,您会遇到类似的问题。即结构不正确。
我会使用 ScheduledExecutorService 来包装延迟队列和线程池。
当你放置一个延迟任务时,你会得到一个 Future 对象,你可以根据需要取消和重新安排。
At time t=0, submit a first task to execute at t=30
安排 30 年后的任务。
At t=10, submit a second task to execute at t=20
为 10 以后安排一个任务并保存 Future。
At t=15, postpone the second task from t=20 to t=100
future .取消和重新安排
t=30 arrive, but the first task isn't executed, it stays in the queue. Its getDelay method now starts returning negative values.
在此示例中,除非您取消它,否则它将执行。
关于java - 异步任务执行与DelayQueue : postponing an already submitted task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14308401/
我需要一个队列来自动删除早于给定毫秒数的元素 - 基本上,我希望队列中的项目在一段时间后过期。 我看到有一个延迟队列似乎在做相反的事情:“一个元素只能在其延迟到期时被采用。” (我从未使用过它)。 也
在 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
我是一名优秀的程序员,十分优秀!