0

java.util.concurrent.LinkedBlockingQueue的简要描述说它是一个FIFO队列,这意味着如果线程A首先将一堆条目(a1,a2,...an)添加到队列中,然后线程B再添加一些东西进入队列(b1,b2,... bm),然后一些消费者线程应该在从 B 获取这些条目之前耗尽 A 中的所有条目(因此是 FIFO)。但我所看到的是,来自 A 的条目和来自 B 的条目是交错的,即使 B 添加其条目的时间比 A 晚得多。我正在对一些 Tomcat + Jersey 应用程序进行代码审查,它使用单例LinkedBlockingQueue加上少数异步工作线程来处理来自客户端的请求条目。

我质疑代码的公平性,因为迟到的请求必须在队列中等待,直到早期的条目全部用完(客户端可以为每个请求提交数千个条目),但令我惊讶的是,迟到的客户得到了他们的回应几乎立即回来。那么这是否意味着LinkedBlockingQueue不是FIFO?请帮忙,因为我很困惑。

4

1 回答 1

3

队列是先进先出的,线程从队列中取出对象的顺序是先进先出。一旦线程获得对象并开始运行方法,FIFO 排序就会丢失。

你怎么知道'来自 A 的条目和来自 B 的这些条目是交错的'?

于 2012-09-20T22:21:44.960 回答