Java 将最后一个任务添加到 BlockingQueue 并丢弃其他任务的线程池

Java Thread Pool that gets the last task added to the BlockingQueue and discard the others

我想要一个具有单线程但具有特殊行为的线程池 BlockingQueue:

如果我向队列添加一个作业然后添加另一个作业(使队列容纳两个作业),我希望线程忽略添加的第一个作业并获取最后一个作业。因此,每次线程从队列中获取任务时,我希望它获取最后一个添加到队列中的作业并丢弃其他作业。

此行为是否有任何默认值 BlockingQueue?实现这一目标的最佳策略是什么?我应该实施自己的 BlockingQueue 吗?如果是,我应该从哪个 BlockingQueue 开始?

我最初的想法是创建一个只能容纳一个任务的有界阻塞队列,但是当它已满并接收另一个任务时,它会交换任务并丢弃之前添加的任务。我说的有道理吗?

我会使用原子变量。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicReference.html

示例:

AtomicReference<X> task_;
//Pop
public X pop() { return task_.getAndSet(NULL); }
//Push
public X push (X val) { return task_.getAndSet(val); }

设计上也是免等待的

您在创建一个只能处理一项任务的有界阻塞队列方面走在了正确的轨道上。此外,将 ThreadPoolExecutor 配置为 DiscardOldestPolicy。因此,无论何时提交第二个任务,它都不适合队列,根据策略,旧的任务将被丢弃。

与构造函数比较ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue, RejectedExecutionHandler)