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