у меня есть следующая ситуация:производитель-потребитель: как знать, сообщить, что prodcution завершена
- чтение данные из базы данных
- работают «расчет» результат
- записи в базу данных
У меня есть поток, который читает из базы данных и помещает сгенерированные объекты в BlockingQueue. Эти объекты чрезвычайно тяжелые, поэтому очередь ограничивает количество объектов в памяти. Несколько потоков берут объекты из очереди, выполняют работу и помещают результаты во вторую очередь. Последний поток принимает результаты второй очереди и сохраняет результат в базе данных.
Проблема в том, как предотвратить взаимоблокировки, например. «потоки вычислений» должны знать, когда больше объектов не будет помещено в очередь. В настоящее время я достигаю этого, передавая ссылки потоков (вызываемых) друг другу и проверяя thread.isDone() перед опросом или предложением, а затем, если элемент имеет значение null. Я также проверяю размер очереди, если в ней есть элементы, они должны быть уничтожены. Использование take или put приводит к взаимоблокировкам.
Есть ли более простой способ достичь этого?
может быть обманом http://stackoverflow.com/questions/5326013/proper-implementation-of-producer-consumer-scenario-and-graceful-termination-of –