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

标签 java multithreading concurrency threadpool

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

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

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

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

最佳答案

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

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

关于将最后一个任务添加到 BlockingQueue 并丢弃其他任务的 Java 线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022686/

相关文章:

java - 使用客户 ID 生成的 JPA 序列号

python - 如何仅将特定内容记录到日志文件中?

multithreading - Delphi如何使用线程

java - java中同步方法的帮助

iphone - 暂停执行直到 Websocket 连接

java - 通过蓝牙打印机打印pdf文件

java - 显示java.lang.IllegalArgumentException的FloatControl.setValue

java - Permgen 空间增量填充/调整大小。如何微调避免调整其大小

c - 如何从 Windows 线程函数返回 char *

java - 为什么系统给我打印的结果每次都不一样(java并发)?