The related implementation seems to have been written for Java 4 and can be simplified a bit with guava and java.util.concurrent :
import java.util.Iterator; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicReference; import com.google.common.base.Throwables; import com.google.common.collect.AbstractIterator; import com.google.common.util.concurrent.Executors; public abstract class Iterators2 { public static <E> Iterator<E> buffer(final Iterator<E> source, int capacity) { return buffer(source, capacity, defaultExecutor); } public static <E> Iterator<E> buffer(final Iterator<E> source, int capacity, final ExecutorService exec) { if (capacity <= 0) return source; final BlockingQueue<E> queue = new ArrayBlockingQueue<E>(capacity);
Note: the above implementation does not attempt to handle exceptions in the original iterator (if selected, the insert task will stop abruptly, leaving the calling thread inhibited.)
finnw
source share