将已经完成的任务的结果 与 新的异步任务的生成 进行解耦。
    最先执行完成的任务的结果放到最前面,可以对先出结果的任务的结果进行处理
    image.png

    1. public static void main(String[] args) throws Exception {
    2. //创建一个线程池
    3. ExecutorService executorService = new ThreadPoolExecutor(4, 10, 10, TimeUnit.SECONDS,
    4. new LinkedBlockingQueue<>(20), new ThreadPoolExecutor.AbortPolicy());
    5. //创建一个CompletionService对象,通过该对象来提交任务,任务的结果依次会放到一个阻塞队列中
    6. CompletionService<Integer> completionService = new ExecutorCompletionService<>(executorService);
    7. IntStream.range(0, 10).forEach(i -> {
    8. completionService.submit(() -> {
    9. Thread.sleep((long) (Math.random() * 1000));
    10. System.out.println(Thread.currentThread().getName());
    11. return i * i;
    12. });
    13. });
    14. for (int i = 0; i < 10; ++i) {
    15. int result = completionService.take().get();
    16. System.out.println(result);
    17. }
    18. executorService.shutdown();
    19. }