Infinite parallel stream
Boaz Nahum
boaznahum at gmail.com
Tue Apr 30 01:50:59 PDT 2013
I'm trying to generate parallel stream from an infinite iterator:
Stream<Data> s = generateParallel(supplier).
parallel().
limit(1000);
s.forEach(System.out::println);
My Spliterator:
private static class ParallelGenerateSpliterator<T> implements
Spliterator<T> {
private final Supplier<? extends T> supplier;
private long estimatedSize;
public ParallelGenerateSpliterator(Supplier<? extends T> supplier,
long estimatedSize) {
this.supplier = supplier;
this.estimatedSize = estimatedSize;
}
public ParallelGenerateSpliterator(Supplier<? extends T> supplier) {
this(supplier, 1 << Runtime.getRuntime().availableProcessors());
}
@Override
public boolean tryAdvance(Consumer<? super T> action) {
action.accept(supplier.get());
return true;
}
@Override
public Spliterator<T> trySplit() {
long spliSize = estimatedSize >> 1;
if (spliSize == 0) {
return null;
}
estimatedSize -= spliSize;
return new ParallelGenerateSpliterator<T>(supplier, spliSize);
}
@Override
public long estimateSize() {
return estimatedSize;
}
@Override
public int characteristics() {
return IMMUTABLE;
}
}
But the examples above run for ever, loop endlessly in AbstractPipeline:
spliterator.forEachRemaining(wrappedSink);
Can I solve it without making spliterator non infinite ?
Thank
Boaz
More information about the lambda-dev
mailing list