2010-10-22 40 views
2

我对java来说是全新的,但我迫切需要创建一个队列和线程。我很困惑,必须使用哪个队列类。[Java]:我的场景使用哪种队列?

这里的情景:

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

此外,Queue,BlockingQueue和ArrayBlockingQueue之间的基本一句话区别是什么,以及在哪些场景中必须选择哪个?

问候, 奇奇

+1

-1线程化是一个具有挑战性的话题,并不适用于一句话的区别。抱歉。 – CurtainDog 2010-10-22 05:50:49

回答

3

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

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

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

3

关于“几句话不同”:Queue和BlockingQueue是接口,而ArrayBlockingQueue是一个实现BlockingQueue接口的类。

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

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

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

+0

LinkedBlockingQueue的大小没有限制 - 它是一个链表实现 – 2010-10-22 08:12:58

+0

它的大小是由构造函数指定的,它可以是Integer.MAX_VALUE :) – 2010-10-22 13:45:32

2

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

+0

我认为你的意思是Executors.newSingleThreadExecutor() – NamshubWriter 2010-10-22 06:04:45

+0

@NamshubWriter - 确实我确实,谢谢你 – CurtainDog 2010-10-25 00:03:12

2

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

阻止:阻止操作(put(),take()等)可能与可选超时。 非阻塞:操作瞬间完成

约束:先后在队列中的项目数的上限

非约束:在项目的数量没有限制队列。

对于ArrayBlockingQueue,它由Array进行备份,而LinkedBlockingQueue由LinkedList进行备份。