java - Executor/Queue 仅处理最后一个已知任务

标签 java concurrency queue executorservice

我想编写一些处理事件的并发代码。此处理可能需要很长时间。

当该事件正在处理时,它应该记录传入的事件,然后在它可以再次运行时处理最后传入的事件。 (其他事件可以扔掉)。这有点像 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/

相关文章:

java - 将 PST 格式的日期和时间转换为 UTC 格式

java - 如何在GWT中添加进度条

java - maven内存不足错误

java - 如何使用 OKHTTP 进行并发网络请求?

c - 原始线程是否执行由 `omp section` 指令定义的程序段之一?

java - 为什么方法 Queue#add() 有 boolean 值返回值?

java - Apache POI 样式应用于所有单元格

java - WorkStealingPool 和 ThreadPoolExecutor 在与 CompletableFuture 一起使用时会产生不同的结果

c++ - 是否可以使用 boost 构建并发进程间消息队列?

c++ - 为什么没有 boost::container::queue ?