我想要一个具有单个线程但对 BlockingQueue
具有特殊行为的线程池:
如果我将一个作业添加到队列中,然后再添加另一个作业(使队列容纳两个作业),我希望线程忽略添加的第一个作业并获取最后一个作业。因此,每当线程从队列中获取任务时,我希望它能将最后一个作业添加到队列中并丢弃其他作业。
是否有任何默认的 BlockingQueue
具有此行为?实现这一目标的最佳策略是什么?我应该实现自己的 BlockingQueue
吗?如果是,我应该从哪个 BlockingQueue
开始?
我最初的想法是创建一个只有一个任务容量的有界阻塞队列,但是当它已满并接收另一个任务时,它会交换任务并丢弃之前添加的任务。我说的有道理吗?
最佳答案
您在创建一个只能处理一项任务的有界阻塞队列方面走在了正确的轨道上。此外,使用 DiscardOldestPolicy
配置您的 ThreadPoolExecutor
.因此,无论何时提交第二个任务,它都不适合队列,根据策略,旧的任务将被丢弃。
与构造函数比较ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue, RejectedExecutionHandler)
关于将最后一个任务添加到 BlockingQueue 并丢弃其他任务的 Java 线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022686/