我应该用什么来解决java中的多线程问题?

时间:2014-12-01 16:33:12

标签: java multithreading

我是java中的新手。在我的应用程序中,我将有一个单独的线程(生产者),它将从输入数据做一些处理,并继续将String对象添加到名为A的数据结构中(我dk使用什么)并同时,多个消费者线程取出什么在A中。每个消费者线程一次取出一个对象,处理它并放入另一个名为B的数据结构。我已经读过关于线程和线程安全的数据结构,但我不知道哪个对我的情况是理想的。我被建议不要使用阻塞数据结构,如BlockingQueue,但没有解释原因。有人可以向我解释为什么并推荐适合A和B的数据结构吗?

我正在考虑使用LinkedList for A和Treeset for B. Am i在正确的轨道上?

3 个答案:

答案 0 :(得分:2)

BlockingQueue是实现生产者 - 消费者模式的首选工具。有关详细信息,请参阅 Java Concurrency in Practice ,第5章。

启动非线程安全的数据结构,例如LinkedListTreeSet,这绝对是错误的。我不知道为什么你的同事建议避免阻止,但如果你试图这样做,你几乎肯定会在整个过程中重新发明阻塞数据结构,并且可能很糟糕。

在您成为专家之前,请坚持标准路径...

答案 1 :(得分:1)

LinkedList不是线程安全的,你应该自己实现一些锁定逻辑。这同样适用于TreeSet。因此,它们不是最佳方式。

BlockingQueue听起来不错,因为它提供了阻止操作。例如。消费者可以阻止等待元素变得可用(由生产者添加到队列中)。此外,如果队列已满,生产者将被阻止,直到消费者从队列中删除元素进行处理。

ConcurrentLinkedQueue也是线程安全的。但它没有提供我上面提到的阻塞操作(我认为你需要那些)。

我建议您选择BlockingQueue。

答案 2 :(得分:1)

从我对你的理解问题。

  1. 'A'(单个实例)从某些地方获取数据,对数据进行一些处理,将数据发布到某些“数据结构”中。
  2. B的多个实例从此数据结构中读取并进行处理。
  3. 这是一种模式 - >它被称为“管道和过滤器”模式,它最常用于有逐步处理数据的地方。一个进程的输出充当另一个进程的输入。在这种情况下 - > A,B充当过滤器,数据结构是管道。在这种情况下,您需要使用队列数据结构: 1.队列应该是线程安全的 2.它应该是固定大小的,因为如果Producer比使用者快,则可能会耗尽所有内存并获得异常。 3.如果队列已满并且A试图将数据放入其中,则它不应该抛出异常,而是在表单A中。

    考虑到上述所有情况,您应该使用“LinkedBlockingQueue”