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