Я думаю, что при определенных обстоятельствах было бы разумно иметь Iterable
, чей iterator()
будет блокировать, хотя иметь отдельный BlockingIterator
было бы глупо. Причина этого в том, что это позволяет вам использовать расширенный цикл for
, который в некоторых случаях может сделать ваш код чище. (Если этого не произойдет в ваших конкретных обстоятельствах, не делайте этого вообще.)
for(Request request:requests) process(request);
Однако итератор все еще не свободен от условия завершения! Итератор должен завершиться, как только очередь будет закрыта для новых элементов, и исчерпает элементы.
Однако проблема все еще остается в том, что, если цикл уже блокировался в методе next()
итератора, единственный способ выйти, если очередь закрыта, - вызвать исключение, которое окружающий код должен был бы обработать правильно. , Если вы решите сделать это, убедитесь, что вы очень четко и точно объясните, как ваша реализация работает в комментариях javadoc.