2

我有以下情况:

  1. 从数据库中读取数据
  2. 做“计算”工作
  3. 将结果写入数据库

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

问题是如何防止死锁,例如。“计算线程”需要知道何时不再有对象放入队列。目前,我通过将线程的引用(可调用)相互传递并在轮询或提议之前检查 thread.isDone() 以及元素是否为空来实现这一点。我还检查了队列的大小,只要其中有元素,就必须消耗。使用 take 或 put 会导致死锁。

有没有更简单的方法来实现这一点?

4

2 回答 2

0

完成的方法之一是将“虚拟”或“毒药”消息作为队列中的最后一条消息,当您确定没有更多任务将到达队列时..例如在放置相关消息之后到数据库查询的最后一行。所以生产者将一个虚拟消息放在队列中,消费者在收到这个虚拟消息后就知道在这批中不需要更多有意义的工作。

于 2011-09-06T05:19:30.280 回答
0

也许你应该看看CompletionService

它旨在将执行器和队列功能合二为一。完成执行的任务将通过完成服务提供

completionServiceInstance.take() 

然后,您可以再次为 3 使用另一个执行程序。即用结果填充 DB,您将使用从 completionServiceInstance 中获取的结果来提供该结果。

于 2011-09-08T13:42:00.653 回答