生产者 - 消费者:如何知道生产完成的信息

时间:2011-09-06 05:12:40

标签: java producer-consumer executorservice termination blockingqueue

我有以下情况:

  1. 从数据库中读取数据
  2. 做“计算”
  3. 将结果写入数据库
  4. 我有一个从数据库中读取的线程,并将生成的对象放入BlockingQueue。这些对象的权重非常大,因此队列限制了内存中的对象数量。 多线程从队列中获取对象,执行工作并将结果放入第二个队列。 最后一个线程从第二个队列获取结果并将结果保存到数据库。

    问题是如何防止死锁,例如。当没有更多的对象被放入队列时,“计算线程”需要知道。 目前,我通过将线程(可调用)的引用相互传递并在轮询或提供之前检查thread.isDone()然后如果元素为null来实现此目的。我也检查队列的大小,只要其中有元素,就必须消耗掉。使用take或put导致死锁。

    有没有更简单的方法来实现这个目标?

2 个答案:

答案 0 :(得分:0)

实现的方法之一是当您确定不再有任务要到达队列时,将“虚拟”或“毒药”消息作为队列中的最后一条消息放置...例如放入与db查询的最后一行相关的消息。因此,生产者在队列上放置一条虚拟消息,接收此虚拟消息的消费者知道此批次中不再需要更有意义的工作。

答案 1 :(得分:0)

也许你应该看看CompletionService

它旨在将执行程序和队列功能合二为一。 已完成执行的任务将通过

从完成服务中获得
completionServiceInstance.take() 

然后,您可以再次使用另一个执行程序3.即使用结果填充数据库,您将使用从completionServiceInstance获取的结果提供结果。