考虑一个应用程序,它使用内存中的FIFO Java
队列来存放随后由线程处理的对象,与许多其他线程并行执行(例如,作为ThreadPool
的一部分)。
每个对象必须由“兼容”线程处理,并且通过检查与对象相关联的标签来确保兼容性(即,每个线程可以处理某些类型的对象,而不是所有对象)。如果一个线程从队列中读取一个对象,并且它读取的标签不在它支持的对象之间,那么它必须忽略该对象。
应用程序必须满足的一些其他特性:
可以像ConcurrentLinkedQueue中所建议的那样使用earlier question,但是单个队列会使分隔每个标签的输入变得棘手。或者,可以为每个线程分配处理单个标签,因此它可以拥有自己的非并发队列。或者也许应该遵循另一种方法。
实施上述规范的最佳方法是什么?
答案 0 :(得分:1)
为什么线程根据对象的标签拒绝任务?
从队列中获取任务的线程必须像工作线程一样。您必须以某种方式设计/编写,线程从队列中获取对象(或任务),读取其标签,并根据其标签对其进行处理。
对象类型和线程类型之间不能有任何对应关系。应该编写每个线程来处理任何对象。
答案 1 :(得分:1)
如果一个线程从队列中读取一个对象,并且它读取的标签不在它支持的对象中,那么它必须忽略该对象。
这是否意味着永远不会执行进入队列的某些任务?这是否意味着无法预测哪些将被忽略以及哪些将被处理?
这听起来不是一个非常好的设计。
如果那不是你的意思,那么可能会被忽略"不是正确的词。
每个对象必须由"兼容" thread ...具有相同标签的所有对象应按它们存放在队列中的顺序进行处理
我不会试图猜测不同类型的工作线程有什么不同,但如果我得到了这个要求,我会为每个不同类型的工作者设置不同的线程池。然后,任何生成任务的人都有责任将它们放入正确的队列中。