代码之家  ›  专栏  ›  技术社区  ›  tryingToLearn

在多线程中,如何维护给定约束的顺序?

  •  0
  • tryingToLearn  · 技术社区  · 5 年前

    也许这是一个标准的多线程问题,它有一个名字。

    队列中的每个项目都有一个项目列表: {"resource" : "r1", "action" : "create"} .现在的问题是从这个队列中读取数据,并以多线程的方式处理操作。但针对特定资源的操作应该是有序的。

    例如,样本输入:

    [{"resource" : "r1", "action" : "create"}, {"resource" : "r2", "action" : "create"}, {"resource" : "r1", "action" : "update"}] .

    预期r2可以在r1之前处理,但r1的创建操作应该在更新操作之前。

    我曾想过并放弃的一个解决方案是为每个资源提供专用线程,但由于线程数量有限且输入量大,这将不起作用。

    有什么建议吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Alanpatchi    5 年前

    是的,你说得对。名字是 PriorityBlockingQueue ,它是线程安全的,并提供了以构造函数参数形式声明队列中对象的自定义比较器的灵活性。

        2
  •  0
  •   Rishabh Sharma    5 年前

    您可以在这里实现驱动程序/工作者体系结构。

    将有多个工人在各自的队列中监听。工人的数量取决于事件的数量。

    船长的职责是从主队列中读取数据,并 将资源字段映射到特定的工作队列 。因此,这意味着资源的所有事件/项目将只进入特定队列。这种资源到特定工作者的映射可以通过一些静态映射或将资源散列到工作者id来实现。

    这与分区的概念非常相似,我们使用分区键来保证特定分区的顺序。