[Java]:我的场景使用哪种队列?

时间:2010-10-22 05:30:09

标签: java queue

我是java的新手,但我迫切需要创建一个队列和线程。我很困惑必须使用哪个队列类。

以下是该方案:

我需要一个线程来处理来自应用程序层的用户事件以及来自较低中间件层的回调事件。 为此,决定维护队列。 每当发生用户事件或回调事件时,事件都将发布到此队列。 线程轮询队列中的事件并采取适当的操作。 相同的队列可以由不同的类(即应用层和下层)写入。因此,哪个队列更安全,以确保不同类别不会同时写入相同的位置?

此外,Queue,BlockingQueue和ArrayBlockingQueue之间的基本单句差异是什么,以及必须选择哪些场景?

此致 基基

4 个答案:

答案 0 :(得分:3)

在您列出的三个中,唯一实际上是类的是ArrayBlockingQueue。阻塞队列与普通队列的不同之处在于,如果对象尝试删除前端项,它将暂停执行,直到有可用的项要删除。

“BlockingQueue”和“Queue”只是一个接口;你无法实例化它们。可以实例化的BlockingQueue的类型是ArrayBlockingQueue,LinkedBlockingQueue等。

就个人而言,我会为此应用程序使用LinkedBlockingQueue - 使用链表的优势在于没有设置最大容量,并且随着队列缩小,内存使用量会减少。

答案 1 :(得分:3)

与“少词差异”有关:Queue和BlockingQueue是接口,而ArrayBlockingQueue是一个可以阻塞BlockingQueue接口的类。

您应该主要在ConcurrentLinkedQueue和ArrayBlockingQueue / LinkedBlockingQueue之间进行选择。

前者为您提供无界限队列(不限制大小),后者提供固定大小的队列,等待存储元素时队列中的空间可用。

作为队列+线程的替代方案,您可以考虑并发包中的Executor和Future接口,它们可能更容易用于实现客户端 - 服务器模型。

答案 2 :(得分:2)

使用更高级别的Executors.newSingleThreadExecutor()

答案 3 :(得分:2)

对于您的方案,您需要的是一个线程安全队列,例如ConcurrentLinkedQueue。关于Queue和BlockingQueue的其他问题。基本上有以下类型的队列实现:

阻止:阻止操作(put(),take()等),并且可选超时。 非阻止:操作立即完成

绑定:队列中的项目数有上限

无约束:对队列中的项目数没有限制。

对于ArrayBlockingQueue,它由一个Array备份,而LinkedBlockingQueue由LinkedList备份。