将已经完成的任务的结果 与 新的异步任务的生成 进行解耦。
最先执行完成的任务的结果放到最前面,可以对先出结果的任务的结果进行处理
public static void main(String[] args) throws Exception {//创建一个线程池ExecutorService executorService = new ThreadPoolExecutor(4, 10, 10, TimeUnit.SECONDS,new LinkedBlockingQueue<>(20), new ThreadPoolExecutor.AbortPolicy());//创建一个CompletionService对象,通过该对象来提交任务,任务的结果依次会放到一个阻塞队列中CompletionService<Integer> completionService = new ExecutorCompletionService<>(executorService);IntStream.range(0, 10).forEach(i -> {completionService.submit(() -> {Thread.sleep((long) (Math.random() * 1000));System.out.println(Thread.currentThread().getName());return i * i;});});for (int i = 0; i < 10; ++i) {int result = completionService.take().get();System.out.println(result);}executorService.shutdown();}
