Java队列中的多线程处理

时间:2014-10-31 03:29:58

标签: java multithreading queue

考虑一个应用程序,它使用内存中的FIFO Java队列来存放随后由线程处理的对象,与许多其他线程并行执行(例如,作为ThreadPool的一部分)。

每个对象必须由“兼容”线程处理,并且通过检查与对象相关联的标签来确保兼容性(即,每个线程可以处理某些类型的对象,而不是所有对象)。如果一个线程从队列中读取一个对象,并且它读取的标签不在它支持的对象之间,那么它必须忽略该对象。

应用程序必须满足的一些其他特性:

  1. 有序处理(即,所有具有相同标签的对象应按照它们存放在队列中的顺序进行处理)。
  2. 高性能(即每秒能够处理数千个相当“重”的物体)。
  3. 可以像ConcurrentLinkedQueue中所建议的那样使用earlier question,但是单个队列会使分隔每个标签的输入变得棘手。或者,可以为每个线程分配处理单个标签,因此它可以拥有自己的非并发队列。或者也许应该遵循另一种方法。

    实施上述规范的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

为什么线程根据对象的标签拒绝任务?

从队列中获取任务的线程必须像工作线程一样。您必须以某种方式设计/编写,线程从队列中获取对象(或任务),读取其标签,并根据其标签对其进行处理。

对象类型线程类型之间不能有任何对应关系。应该编写每个线程来处理任何对象。

答案 1 :(得分:1)

  

如果一个线程从队列中读取一个对象,并且它读取的标签不在它支持的对象中,那么它必须忽略该对象。

这是否意味着永远不会执行进入队列的某些任务?这是否意味着无法预测哪些将被忽略以及哪些将被处理?

这听起来不是一个非常好的设计。

如果那不是你的意思,那么可能会被忽略"不是正确的词。

  

每个对象必须由"兼容" thread ...具有相同标签的所有对象应按它们存放在队列中的顺序进行处理

我不会试图猜测不同类型的工作线程有什么不同,但如果我得到了这个要求,我会为每个不同类型的工作者设置不同的线程池。然后,任何生成任务的人都有责任将它们放入正确的队列中。