异步编程
February 27, 2023About 2 min
异步编程
Future
同步与异步的概念
- 同步:发出一个调用之后,在没有得到结果之前, 该调用不可返回,一直等待。
- 异步:调用在发出之后,不用等待返回结果,该调用直接返回。
阻塞与非阻塞的概念
阻塞和非阻塞指:当前接口数据还未准备就绪时,线程是否被阻塞挂起。
阻塞挂起:就是当前线程还处于 CPU 时间片当中,调用了阻塞的方法,由于数据未准备就绪,则时间片还未到就让出 CPU。
所以阻塞和同步看起来都是等,但是本质上它们不一样,同步的时候可没有让出 CPU。
而非阻塞就是当前接口数据还未准备就绪时,线程不会被阻塞挂起,可以不断轮询请求接口,看看数据是否已经准备就绪。
至此我们可以得到一个结论:
- 同步&异步:当数据还未处理完成时,代码的逻辑处理方式不同。
- 阻塞&非阻塞:当数据还未处理完成时(未就绪),线程的状态。
同步&异步其实是处于框架这种高层次维度来看待的,而阻塞&非阻塞往往针对底层的系统调用方面来抉择,也就是说两者是从不同维度来考虑的。
没有返回值的:runAsync
有返回值的:submitAsync
Future 方法
Future 接口有 5 个方法:
boolean cancel(boolean mayInterruptIfRunning):尝试取消执行任务。boolean isCancelled():判断任务是否被取消。boolean isDone(): 判断任务是否已经被执行完成。get():等待任务执行完成并获取运算结果。get(long timeout, TimeUnit unit):多了一个超时时间。
CompletableFuture
Future 在实际使用过程中存在一些局限性:
- 不支持异步任务的编排组合
- 获取计算结果的
get()方法为阻塞调用
Java 8 引入CompletableFuture 类可以解决Future 的这些缺陷。CompletableFuture 除了提供了更为好用和强大的 Future 特性之外,还提供了函数式编程、异步任务编排组合(可将多个异步任务串联起来,组成一个完整的链式调用)等能力。
下面我们来简单看看 CompletableFuture 类的定义。
CompletionStage 接口描述了一个异步计算的阶段。很多计算可以分成多个阶段或步骤,此时可以通过它将所有步骤组合起来,形成异步计算的流水线。
CompletionStage 接口中的方法比较多,CompletableFuture 的函数式能力就是这个接口赋予的。从这个接口的方法参数你就可以发现其大量使用了 Java8 引入的函数式编程。