我什么时候应该在LinkedBlockingQueue上使用SyncQueue

2022-08-31 16:12:13
new SynchronousQueue()
new LinkedBlockingQueue(1)

有什么区别?何时应使用容量 1?SynchronousQueueLinkedBlockingQueue


答案 1

同步队列更像是一个交接,而LinkedBlockingQueue只允许单个元素。不同之处在于,在有相应的 take() 调用之前,对同步队列的 put() 调用不会返回,但是对于大小为 1 的 LinkedBlockingQueue,put() 调用(对空队列)将立即返回。

我不能说我自己曾经直接使用过SyncQueue,但它是用于方法的默认BlockQueue。它本质上是BlockingQueue的实现,当你并不真正想要队列(你不想维护任何挂起的数据)时。Executors.newCachedThreadPool()


答案 2

据我所知,上面的代码也做同样的事情。

不,代码根本不相同。

Sync.Q. 需要有服务员才能成功。LBQ将保留该项目,即使没有服务员,报价也将立即完成。

SyncQ 对于任务移交非常有用。想象一下,你有一个列表,其中包含挂起的任务和3个可用的线程等待队列,尝试使用列表的1/4,如果不接受线程可以自己运行任务。[最后1/4应该由当前线程处理,如果你想知道为什么1/4而不是1/3]offer()

想想尝试将任务交给工作人员,如果没有可用的工作人员,您可以选择自己执行任务(或引发异常)。相反,使用LBQ,将任务保留在队列中并不能保证任何执行。

注意:使用者和发布者的情况相同,即发布者可以阻止并等待使用者,但在返回或返回之后,它确保任务/元素被处理。offerpoll


推荐