从BlockingQueue读取时,seque没有阻塞

时间:2013-06-05 18:08:30

标签: clojure

documentation开始,似乎在repl处评估的以下内容应该阻止?

(take 1 (seque (java.util.concurrent.LinkedBlockingQueue.)))

当然我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:2)

如果没有传递seque一个序列来处理它是一个错误(你可以覆盖要使用的队列,但是你仍然必须传递一个序列)。它可以做任何想做的事情,因为你已经通过了无意义的论点。它碰巧返回一个空序列,IMO不是最好的事情:报告错误会更好,但是作为做出的任何实现决策的结果,这就是发生的事情。

编辑:评论者指出LinkedBlockingQueue 一个序列,因为它是一个j.u.Collection,它是可选的。所以它不是错误的输入,而是seque的有效(空)序列。 LBQ在被要求查看其内容的顺序视图时,会查看它是否有任何项目;它没有,所以它返回一个空序列。

答案 1 :(得分:0)

查看seque的{​​{3}},我了解它的作用是创建一个新的LinkedBlockingQueue并使用代理开始使用序列s。使用代理程序,以便将s中的元素“复制”到创建的LinkedBlockingQueue异步完成。

文档指出,如果从原始序列到中间BlockingQueue的异步复制比使用延迟序列seque的速度慢,则会阻塞。

这根本不是很明显,我会解释你在阅读seque的文档时所做的一样。我不得不查看消息来源,弄清楚发生了什么。