Двухстороннее уведомление в очереди

1

У меня типичная проблема потребителей-производителей, единственная разница в том, что потребитель не должен работать над каждой единицей производителя. Производитель изготавливается с фиксированным объемом данных, затем потребитель должен его взять. Кроме того, продюсер должен дождаться, пока потребитель прочитает партию.

Я использую TransferQueue для этого, но теперь я хочу, чтобы после определенного времени я должен был читать данные, даже если размер невелик.

Как правило, мне нужно 2-разовое уведомление о очереди, как это можно достичь?

Теги:
queue

2 ответа

0
Лучший ответ

Я бы предложил использовать две темы.

Идея заключается в том, что производитель будет помещать новые данные в вашу Queue до тех пор, пока не появится желаемое количество записей. Затем он ждет (wait()) для уведомления (notify()). С другой стороны, потребитель также будет ждать, пока нужный объем данных не окажется в очереди ИЛИ до тех пор, пока не будет достигнут определенный тайм-аут (wait(int timeToWait)). Затем он обработает данные и уведомит продюсера о работе.

  • 0
    На самом деле я делаю что-то на этих строках, только вот фрагмент кода. Поток 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(); } Я надеялся на что-то более изысканное.
0

Работала по аналогичной проблеме, когда мне нужно было определить конец данных от производителя, чтобы совершить пакет и начать дальше. Я использовал instanceof для определения конца объектов.

В принципе, создан класс EndOfData и отправляет этот объект в качестве последней записи в очередь. Пользователь проверял, был ли получен полученный объект экземпляром класса данных или EndOfData.

Представляет дополнительные, если проверка, но хорошо работает для меня. Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню