什么时候应该使用SynchronousQueue
new SynchronousQueue() new LinkedBlockingQueue(1)
有什么不同? 当我应该使用容量为1的LinkedBlockingQueue
SynchronousQueue
?
SynchronousQueue更像是一个切换,而LinkedBlockingQueue只允许一个元素。 不同之处在于,调用SynchronousQueue的put()调用将在返回相应的take()调用之前不会返回 ,但LinkedBlockingQueue的大小为1时,put()调用(将返回空队列)将立即返回。
我不能说自己曾经直接使用SynchronousQueue,但是它是用于Executors.newCachedThreadPool()
方法的默认BlockingQueue。 它基本上是BlockingQueue实现,当你不需要一个队列(你不想维护任何未决的数据)。
据我所知上面的代码做同样的事情。
不,代码是不一样的。
Sync.Q. 要求有服务员报价成功。 即使没有服务员,LBQ也会保留物品和报价。
SyncQ对于任务切换很有用。 假设你有一个待处理的任务列表和3个等待在队列中的线程,如果不接受,尝试使用列表的四分之一的offer()
,线程可以自行运行任务。 [最后的1/4应该由当前线程处理,如果你想知道为什么1/4而不是1/3]
想想把任务交给工人,如果没有可用的工具,你可以select自己执行任务(或抛出exception)。 相反w / LBQ,将任务留在队列中并不保证任何执行。
注意:消费者和发布者的情况是相同的,即发布者可以阻止和等待消费者,但是在offer
或者poll
返回之后,确保任务/元素被处理。
使用SynchronousQueue的一个原因是提高应用程序的性能。 如果您必须在线程之间切换,则需要一些同步对象。 如果您可以满足使用条件,SynchronousQueue是我find的最快的同步对象。 其他人同意。 请参阅: BlockingQueue的实现:SynchronousQueue和LinkedBlockingQueue之间有什么区别
SynchronousQueue以类似的方式工作,主要区别如下:1)SynchronousQueue的大小为0 2)如果take()方法能够在同一时刻从队列中获取该元素,put()方法将只插入一个元素如果消费者take()调用将花费一些时间来消耗它,则不能插入一个元素。
SynchronousQueue – 仅当有人在该时刻接收到时插入。