code: public static <I,O> ConcurrentProcessingIterable<I, O> processConcurrently(Iterable<I> input, Processor<I,O> processor, int blockSize, int threadPoolSize, int queueCapacity) {
          return new ConcurrentProcessingIterable<I,O>(input, processor, blockSize, threadPoolSize, queueCapacity);
      }
docs: Process iterable concurrently using the processor. IMPORTANT, you must close the iterable (it implements Closeable) after use otherwise, the process
  may never exit.
  @param input input iterable
  @param processor a processor that transforms I into O
  @param blockSize number of items that is processed in one go by each consumer thread
  @param threadPoolSize number of threads (including the producer threads). CPU count +1 is typically what you want for CPU constrained tasks.
  @param queueCapacity number of items that get queued. Tune this to ensure the consumer threads don't run out of work.
  @param <I> input type
  @param <O> output type
  @return a concurrent processing iterable that will process the input iterable concurrently and offer the output as another iterable.