【发布时间】:2012-07-03 07:35:31
【问题描述】:
我希望编写一些处理事件的并发代码。此处理可能需要很长时间。
当该事件正在处理时,它应该记录传入事件,然后在它可以再次运行时处理最后传入的事件。 (可以丢弃其他事件)。这有点像 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;
}
}
});
}
}
【问题讨论】:
-
你想让这个执行器正常处理提交给它的其他任务吗?还是这个执行器只用于处理你的事件?
-
它应该始终执行最新的已知任务,并忽略已排队但未执行的中间任务。我已经提出了我的解决方案,但还没有测试过。
-
这意味着执行器一次只主动执行一项任务,而不管您使用多少个线程启动执行器?
-
我不这么认为......如果你有一个永远不会完成的任务,那么第一个线程总是很忙......线程池中的下一个线程将接下一个传入的任务.
标签: java concurrency queue executorservice