CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲

2.3 CompletableFuture对Future的改进

2.3.1 CompletableFuture为什么会出现

  • get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。

  • isDene()方法容易耗费cpu资源(cpu空转),

  • 对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动调用该回调函数,这样,我们就不用等待结果

jdk8设计出CompletableFuture,CompletableFuture提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。

2.3.2 CompletableFuture和CompletionStage介绍

类架构说明:

CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲_第1张图片

接口CompletionStage

  • 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。
  • 一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发

类CompletableFuture

  • 提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法
  • 它可能代表一个明确完成的Future,也可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作

2.3.3 核心的四个静态方法,来创建一个异步任务

CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲_第2张图片

CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲_第3张图片CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲_第4张图片

指定线程池:

package com.nanjing.gulimall.zhouyimo.test;

import java.util.concurrent.*;

/**
 * @author zhou
 */
public class CompletableFutureVuildDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        CompletableFuture completableFuture = CompletableFuture.runAsync(() ->{
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },threadPool);
        System.out.println(completableFuture.get());
        threadPool.shutdown();
    }
}

CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲_第5张图片

package com.nanjing.gulimall.zhouyimo.test;

import java.util.concurrent.*;

/**
 * @author zhou
 */
public class CompletableFutureVuildDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        /*CompletableFuture completableFuture = CompletableFuture.runAsync(() ->{
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },threadPool);
        System.out.println(completableFuture.get());
        threadPool.shutdown();*/

        CompletableFuture objectCompletableFuture = CompletableFuture.supplyAsync(()->{
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "hello supplyAsync";
        },threadPool);
        System.out.println(objectCompletableFuture.get());//hello supplyAsync
        threadPool.shutdown();
    }
}

你可能感兴趣的:(JUC并发编程与源码分析,前端,javascript,开发语言)