我什么时候应该在LinkedBlockingQueue上使用SyncQueue
2022-08-31 16:12:13
new SynchronousQueue()
new LinkedBlockingQueue(1)
有什么区别?何时应使用容量 1?SynchronousQueue
LinkedBlockingQueue
new SynchronousQueue()
new LinkedBlockingQueue(1)
有什么区别?何时应使用容量 1?SynchronousQueue
LinkedBlockingQueue
同步队列更像是一个交接,而LinkedBlockingQueue只允许单个元素。不同之处在于,在有相应的 take() 调用之前,对同步队列的 put() 调用不会返回,但是对于大小为 1 的 LinkedBlockingQueue,put() 调用(对空队列)将立即返回。
我不能说我自己曾经直接使用过SyncQueue,但它是用于方法的默认BlockQueue。它本质上是BlockingQueue的实现,当你并不真正想要队列(你不想维护任何挂起的数据)时。Executors.newCachedThreadPool()
据我所知,上面的代码也做同样的事情。
不,代码根本不相同。
Sync.Q. 需要有服务员才能成功。LBQ将保留该项目,即使没有服务员,报价也将立即完成。
SyncQ 对于任务移交非常有用。想象一下,你有一个列表,其中包含挂起的任务和3个可用的线程等待队列,尝试使用列表的1/4,如果不接受线程可以自己运行任务。[最后1/4应该由当前线程处理,如果你想知道为什么1/4而不是1/3]offer()
想想尝试将任务交给工作人员,如果没有可用的工作人员,您可以选择自己执行任务(或引发异常)。相反,使用LBQ,将任务保留在队列中并不能保证任何执行。
注意:使用者和发布者的情况相同,即发布者可以阻止并等待使用者,但在返回或返回之后,它确保任务/元素被处理。offer
poll