异步编程
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 引入的函数式编程。