我是java中的新手。在我的应用程序中,我将有一个单独的线程(生产者),它将从输入数据做一些处理,并继续将String对象添加到名为A的数据结构中(我dk使用什么)并同时,多个消费者线程取出什么在A中。每个消费者线程一次取出一个对象,处理它并放入另一个名为B的数据结构。我已经读过关于线程和线程安全的数据结构,但我不知道哪个对我的情况是理想的。我被建议不要使用阻塞数据结构,如BlockingQueue,但没有解释原因。有人可以向我解释为什么并推荐适合A和B的数据结构吗?
我正在考虑使用LinkedList for A和Treeset for B. Am i在正确的轨道上?
答案 0 :(得分:2)
BlockingQueue
是实现生产者 - 消费者模式的首选工具。有关详细信息,请参阅 Java Concurrency in Practice ,第5章。
启动非线程安全的数据结构,例如LinkedList
和TreeSet
,这绝对是错误的。我不知道为什么你的同事建议避免阻止,但如果你试图这样做,你几乎肯定会在整个过程中重新发明阻塞数据结构,并且可能很糟糕。
在您成为专家之前,请坚持标准路径...
答案 1 :(得分:1)
LinkedList不是线程安全的,你应该自己实现一些锁定逻辑。这同样适用于TreeSet。因此,它们不是最佳方式。
BlockingQueue听起来不错,因为它提供了阻止操作。例如。消费者可以阻止等待元素变得可用(由生产者添加到队列中)。此外,如果队列已满,生产者将被阻止,直到消费者从队列中删除元素进行处理。
ConcurrentLinkedQueue也是线程安全的。但它没有提供我上面提到的阻塞操作(我认为你需要那些)。
我建议您选择BlockingQueue。
答案 2 :(得分:1)
从我对你的理解问题。
这是一种模式 - >它被称为“管道和过滤器”模式,它最常用于有逐步处理数据的地方。一个进程的输出充当另一个进程的输入。在这种情况下 - > A,B充当过滤器,数据结构是管道。在这种情况下,您需要使用队列数据结构: 1.队列应该是线程安全的 2.它应该是固定大小的,因为如果Producer比使用者快,则可能会耗尽所有内存并获得异常。 3.如果队列已满并且A试图将数据放入其中,则它不应该抛出异常,而是在表单A中。
考虑到上述所有情况,您应该使用“LinkedBlockingQueue”