工作队列的Java并发抽象

时间:2011-11-18 19:08:32

标签: java multithreading concurrency

我发现自己在想太多地解决并发问题,这对我来说表明可能有一个抽象来完成我想要的东西而不是我应该使用。

这是基本前提:

  • 我有一个可以在其上工作的数据队列
  • 线程可以进入并为队列添加工作
  • 与启动和完成一组要处理的项目相关的开销很高
  • 一次只能有一个线程处理数据

我认为以下API会很好:

  • 线程可以将工作添加到队列
  • 如果当前未处理队列中的数据,请调用后台任务以开始工作
  • 后台任务继续处理队列,直到它为空,即使其他线程删除了要在队列中处理的其他项目

困难的部分是保证如果一个线程在工作线程结束的同时丢失了一部分工作,数据就不会在队列中停留。

我认为存在一个解决这个问题的抽象。有人知道吗?


编辑:

更具体地说,我是在谈论增量搜索索引器,而添加到队列中的数据是要处理的其他文档。当我谈论启动和停止一组工作时,我指的是构建缓存上下文并提交更新的索引。我们不能一直运行一个工作线程,因为如果我们从不提交,新索引永远不会被提交,如果我们不定期关闭缓存上下文,它可能会变得太大。

目标是大多数时候,一次只处理几件工作,但在负载繁重的时候,我们不会浪费太多时间做太多的提交。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

"一次只有一个线程可以处理数据" - 此行表示您需要一个信号量来控制有多少工人(消费者)可以工作。

对于生产者方,您将需要一个阻塞队列,以便生产者在添加到列表之前阻止(等待)列表是否已满。

答案 2 :(得分:0)

您可能需要查看Disruptor,这是一个开源项目,该项目全部用于处理非常低延迟的批次数据,按顺序排列,顺序。我没有亲自使用它,但它听起来适合你的问题。