我想要一个具有单个线程但具有BlockingQueue
特殊行为的线程池:
如果我将一个作业添加到队列中,然后添加另一个作业(使队列中包含两个作业),则我希望线程忽略添加的第一个作业并获取最后一个。因此,每次线程从队列中获取任务时,我都希望它将最后一个作业添加到队列中并丢弃其他任务。
是否有任何默认的BlockingQueue
与这种行为?实现这一目标的最佳策略是什么?我应该实现自己的BlockingQueue
吗?如果是,我应该从哪个BlockingQueue
开始?
我最初的想法是创建一个仅能容纳一个任务的有界阻塞队列,但是当队列满了并接收到另一个任务时,它将交换任务,放弃先前添加的任务。我有道理吗?
最佳答案
您正在创建一个只能执行一项任务的有限制的阻塞队列,这是正确的。另外,用 ThreadPoolExecutor
配置DiscardOldestPolicy
。因此,每当提交第二个任务时,该任务就无法放入队列中,并且根据策略,较旧的任务将被丢弃。
与构造函数 ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue, RejectedExecutionHandler)
进行比较