// concurrent/CachedThreadPool3.java // (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; import java.util.concurrent.*; import java.util.stream.*; public class CachedThreadPool3 { public static Integer extractResult(Future f) { try { return f.get(); } catch(Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); List tasks = IntStream.range(0, 10) .mapToObj(CountingTask::new) .collect(Collectors.toList()); List> futures = exec.invokeAll(tasks); Integer sum = futures.stream() .map(CachedThreadPool3::extractResult) .reduce(0, Integer::sum); System.out.println("sum = " + sum); exec.shutdown(); } } /* Output: 2 pool-1-thread-3 100 6 pool-1-thread-7 100 5 pool-1-thread-6 100 7 pool-1-thread-8 100 4 pool-1-thread-5 100 9 pool-1-thread-10 100 3 pool-1-thread-4 100 0 pool-1-thread-1 100 1 pool-1-thread-2 100 8 pool-1-thread-9 100 sum = 1000 */