производитель-потребитель: как узнать сообщить, что производство завершено - PullRequest
2 голосов
/ 06 сентября 2011

у меня следующая ситуация:

  1. Чтение данных из базы данных
  2. сделать работу "расчет"
  3. записать результат в базу данных

У меня есть поток, который читает из базы данных и помещает сгенерированные объекты в BlockingQueue. Эти объекты имеют очень большой вес, поэтому очередь для ограничения количества объектов в памяти. Несколько потоков берут объекты из очереди, выполняют работу и помещают результаты во вторую очередь. Последний поток получает результаты из второй очереди и сохраняет результат в базе данных.

Проблема в том, как предотвратить взаимные блокировки, например. «потоки вычислений» должны знать, когда больше объектов не будет помещено в очередь. В настоящее время я достигаю этого, передавая ссылки на потоки (вызываемые) друг другу и проверяя thread.isDone () перед опросом или предложением, а затем, если элемент имеет значение null. Я также проверяю размер очереди, поскольку в ней есть элементы, которые необходимо использовать. Использование take или put приводит к тупикам.

Есть ли более простой способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

Может быть, вам стоит взглянуть на CompletionService

Он предназначен для объединения функций исполнителя и очереди в одном.Задачи, завершившие выполнение, будут доступны в сервисе завершений через

completionServiceInstance.take() 

. Затем вы снова можете использовать другого исполнителя для 3., т. Е. Заполнить БД результатами, которые вы передадите с результатами, взятыми из завершения сервиса.

0 голосов
/ 06 сентября 2011

Один из способов сделать это состоит в том, чтобы поместить «фиктивное» или «ядовитое» сообщение в качестве последнего сообщения в очередь, когда вы уверены, что в очередь больше не будет поступать задач ... например, после помещения сообщение, относящееся к последней строке запроса базы данных. Таким образом, производитель помещает фиктивное сообщение в очередь, а потребитель, получив это фиктивное сообщение, знает, что в этом пакете больше не ожидается значимой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...