Java中的并发和可伸缩数据结构来处理任务?

Phi*_*EUR 6 java concurrency multithreading scalability data-structures

对于我当前的开发,我有很多线程(Producers)创建Tasks和许多线程消耗这些Tasks(consumers)

每个Producers都由一个唯一的名称标识; A Tasks由以下部分组成:

  • 它的名字 Producers
  • 一个名字
  • 数据

我的问题涉及(Producers)和(consumers)使用的数据结构.

并发队列?

天真地,我们可以想象Producers使用Tasks和(consumers)读取/消耗Tasks存储在并发队列中的并发队列.

我认为这个解决方案相当规模,但是单个案例是有问题的:如果a Producers创建非常快,两个Tasks具有相同的名称但不是相同的数据(任务T1和T2具有相同的名称但T1具有数据D1和T2具有数据D2),理论上可能它们按T2然后T1的顺序消耗!

任务图+队列?

现在,我想MyQueue基于Map + Queue 创建自己的数据结构(比方说).比如一个队列,它会有一个pop()和一个push()方法.

  • 该pop()方法非常简单
  • 该push()方法将:
    • 检查是否Task尚未插入现有MyQueue(find()在地图中执行)
      • 如果找到:存储在Task待插入中的数据将与存储在找到的数据中合并Task
      • 如果没有找到:Task将插入地图中,并在队列中添加一个条目

当然,我必须安全地进行并发访问......这肯定是我的问题; 我几乎可以肯定这个解决方案不会扩展.

所以呢?

所以我现在的问题是,为了满足我的要求,我必须使用哪种最佳数据结构

Old*_*eon 1

您可以尝试 Heinz Kabutz 的Striped Executor Service(一个可能的候选者)。

这个神奇的线程池将确保所有具有相同 stripeClass 的 Runnable 都会按照提交的顺序执行,但具有不同 stripedClass 的 StripedRunner 仍然可以独立执行。