我想编写一些处理事件的并发代码。此处理可能需要很长时间。
当该事件正在处理时,它应该记录传入的事件,然后在它可以再次运行时处理最后传入的事件。 (其他事件可以扔掉)。这有点像 FILO 队列,但我只需要在队列中存储一个元素。
理想情况下,我想将我的新执行器插入到我的事件处理架构中,如下所示。
public class AsyncNode<I, O> extends AbstractNode<I, O> {
private static final Logger log = LoggerFactory.getLogger(AsyncNode.class);
private Executor executor;
public AsyncNode(EventHandler<I, O> handler, Executor executor) {
super(handler);
this.executor = executor;
}
@Override
public void emit(O output) {
if (output != null) {
for (EventListener<O> node : children) {
node.handle(output);
}
}
}
@Override
public void handle(final I input) {
executor.execute(new Runnable() {
@Override
public void run() {
try{
emit(handler.process(input));
}catch (Exception e){
log.error("Exception occured whilst processing input." ,e);
throw e;
}
}
});
}
最佳答案
我也不会。我会对您要处理的事件有一个 AtomicReference,并添加一个任务以破坏性方式处理它。
final AtomicReference<Event> eventRef =
public void processEvent(Event event) {
eventRef.set(event);
executor.submit(new Runnable() {
public vodi run() {
Event e = eventRef.getAndSet(null);
if (e == null) return;
// process event
}
}
}
这只会在执行器空闲时处理下一个事件,而无需自定义执行器或队列(可用于其他事情)
这也扩展到具有键控事件,即您想要处理键的最后一个事件。
关于java - Executor/Queue 仅处理最后一个已知任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11306425/