2 способа уведомления в очереди

#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, но для меня сработало хорошо. Надеюсь, это поможет.