#java #queue
#java #очередь
Вопрос:
У меня типичная проблема производителя с потребителем, единственное отличие заключается в том, что потребителю не нужно работать с каждой единицей, производимой производителем. Производитель выполняется с фиксированным объемом данных, тогда потребитель должен его принять. Кроме того, производитель должен дождаться, пока потребитель не прочитает пакет.
Для этого я использую TransferQueue, но теперь я хочу, чтобы через определенное время я должен был прочитать данные, даже если размер невелик.
обычно мне нужно 2-стороннее уведомление об очереди, как этого можно достичь?
Ответ №1:
Я бы предложил использовать два потока.
Идея заключается в том, что производитель будет помещать новые данные в ваш Queue
до тех пор, пока не будет получено желаемое количество записей. Затем он ожидает ( wait()
) уведомления ( notify()
). С другой стороны, потребитель также будет ждать, пока в очереди не окажется нужное количество данных Или пока не будет достигнут определенный тайм-аут ( wait(int timeToWait)
). Затем он обработает данные и уведомит производителя о продолжении работы.
Комментарии:
1. На самом деле я делаю что-то в этих строках, только вот фрагмент кода. Поток 1:
synchronized (unprocessedData) { if (thresholdReached()) { unprocessedData.notify(); unprocessedData.wait(); } else unprocessedData.add(data); }
Поток 2:synchronized (unprocessedData) { unprocessedData.wait(10 * 60 * 60); //Do something unprocessedData.notifyAll(); }
Я надеялся на что-то более утонченное.
Ответ №2:
Работал над аналогичной проблемой, когда мне нужно определить конец данных от производителя, чтобы зафиксировать пакет и начать следующий. Я использовал instanceof для определения конца объектов.
В основном, создается класс EndOfData и отправляется этот объект как последняя запись в очереди. Потребитель проверил, был ли полученный объект классом данных instanceOf или EndOfData.
Вводит дополнительную проверку if, но для меня сработало хорошо. Надеюсь, это поможет.