BlockingQueue的背景迭代

时间:2014-11-07 18:17:09

标签: java multithreading

我需要一种具有非常好的性能特征的特定类型的队列,所以我需要自己动手(幸运的是它只有几行代码)。

所以我使用LinkedBlockingQueue来支持池,因为与ArrayBlockingQueue不同,它有单独的take和put锁。

偶尔我需要遍历整个池以保持池化套接字(因为我正在使用的服务器有一个空闲的客户端超时)。

我无法找到一个很好的方法来做到这一点。我想要做的是有一个迭代器,它允许我从队列中删除池对象(如果存在),运行keep-alive ping,然后返回它。但是LinkedBlockingQueue迭代器不允许我在调用#next后保持元素“被删除”。

我看到的唯一解决方案(我不喜欢)是使用#drainTo删除池中的所有项目,并在处理时返回每个项目。这就是我现在正在做的事情。我不想引入新的锁。

我想我可以选择确保队列是FIFO,在迭代时获取队列计数,只需#poll每个元素,而count> = 0或#poll返回null。

我是否缺少一种有效或不需要FIFO的解决方案?

1 个答案:

答案 0 :(得分:0)

不引入新锁而不使用drainTo的最佳机会就是像集合一样迭代队列。 注意您当前正在查看的迭代元素可能已从队列中删除,因此您可能需要进行其他同步。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html#iterator()

  

返回的迭代器是一个“弱一致”的迭代器,它永远不会抛出ConcurrentModificationException,并保证在构造迭代器时遍历元素,并且可能(但不保证)反映构造之后的任何修改。 / p>