The reason I've written ExecutorAllCompletionService in the past is that ExecutorCompletionService uses *unbounded* queue. When processing external store elements, we can encounter much more data than what can fit into memory - that's why I always want to introduce some bounds when dealing with cache stores.