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

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

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

我最初的想法是创建一个仅能容纳一个任务的有界阻塞队列,但是当队列满了并接收到另一个任务时,它将交换任务,放弃先前添加的任务。我有道理吗?

最佳答案

您正在创建一个只能执行一项任务的有限制的阻塞队列,这是正确的。另外,用 ThreadPoolExecutor 配置DiscardOldestPolicy。因此,每当提交第二个任务时,该任务就无法放入队列中,并且根据策略,较旧的任务将被丢弃。

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

10-07 19:01
查看更多