Я хотел бы иметь итератор, который может считываться несколькими потоками одновременно, чтобы я мог обрабатывать данные источника итератора параллельно.Проблема в том, что я не могу соединить hasNext()
с его логическим next()
, поскольку они могут идти в разные потоки.(То есть два потока могут вызвать hasNext()
, каждый из которых видит true, а затем второй поток завершается с ошибкой, потому что был только один элемент.) Моя проблема в том, что для некоторых источников я не знаю, есть ли у него следующий элементпока я не попытаюсь это прочитать.Одним из таких примеров является чтение строк из файла;другой читает Term
экземпляров из индекса Lucene.
Я думал о настройке очереди внутри итератора и заполнении очереди отдельным потоком.Таким образом, hasNext()
реализуется с точки зрения размера очереди.Но я не понимаю, как я могу гарантировать, что очередь будет заполнена, потому что этот поток может истощиться.
Должен ли я игнорировать контракт Итератора и просто вызывать next()
до тех пор, пока не будет выброшено NoSuchElementException
?
Есть ли более элегантный способ решения проблемы?