何时在TransferQueue上使用BlockingQueue



BlockingQueue和TransferQueue之间的差异已经很好地解释了这两个队列之间的差异,但看起来TransferQueue只是BlockingQueue的更好版本。

有没有什么情况我们应该使用BlockingQueue而不是TransferQueue,或者使用LinkedBlockingQueue来代替LinkedTransferQueue?

使用TransferQueue可能会降低吞吐量,尤其是在生产者/消费者中每个工作单元的处理时间不同的情况下。考虑一个生产者/消费者平均速度相同的例子——假设你的生产者一直为每件商品花费5秒,但消费者需要0秒(丢弃它(或10秒的处理时间。

如果使用TransferQueuetransfer/take,则总体处理时间将更长,因为生产者可能需要等待5-10秒,消费者才能在下一步使用take。类似地,消费者可能会等待5秒钟,等待生产商提供下一个产品。生产者-消费者每件商品的平均时间超过5秒。

使用具有适当缓冲队列长度的BlockingQueueput/take,生产者可以保持更忙,如果一个特定的消费者任务需要10秒,则添加到队列中,如果处理几个快速处理的项目,则消费者稍后会赶上。生产者-消费者每件商品的平均时间应该接近5秒。

但是,如果您的应用程序需要知道消费者何时处理商品,请使用TransferQueue

最新更新