CompletableFuture: 组合式异步编程
1.先了解下什么是吞吐量:
吞吐量是指对网络、设备、端口、虚电路或其他设施,单位时间内成功地传送数据的数量(以比特、字节、分组等测量)。(百科)
2.并发,并行:
并发:单个处理器核在多个任务之间切换处理
并行:多个处理器核同时处理多个任务
Future 接口
Future接口建模了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个运用hui被返回调用方。
(简单说就是你去奶茶店排队买奶茶,店员给你一个序号,你就不用在那里等待,可以去做其他事,等好了再去拿,这就是异步)
例子:
ExecutorService executor = Executors.newCachedThreadPool();
Future<Double> future = executor.submit(new Callable<Double>() {
public Double call() {
return doSomeLongComputation();
}});
doSomethingElse();
try {
Double result = future.get(2, TimeUnit.SECONDS);
} catch (Exception e) {
// 计算抛出一个异常
}
这种编程方式让你的线程可以在
ExecutorService
以并发方式调 用另一个线程执行耗时操作的同时,去执行一些其他的任务。接着,如果你已经运行到没有异步 操作的结果就无法继续任何有意义的工作时,可以调用它的get
方法去获取操作的结果。如果操 作已经完成,该方法会立刻返回操作的结果,否则它会阻塞你的线程,直到操作完成,返回相应 的结果。
Feature 使用重 载版本的get
方法,它接受一个超时的参数,通过它,你可以定义你的线程等待
Future
结果的最 长时间,而不是一直等待下去
使用 CompletableFuture 构建异步应用
我们知道
Future
接口提供了方法来检测异步计算是否已经结束(使用 isDone方法),等待异步操作结束,以及获取计算的结果。但是这些特性还不足以让你编写简洁 的并发代码。比如,我们很难表述Future
结果之间的依赖性;从文字描述上这很简单,“当长时 间计算任务完成时,请将该计算的结果通知到另一个长时间运行的计算任务,这两个计算任务都 完成后,将计算的结果与另一个查询操作结果合并”。但是,使用Future
中提供的方法完成这样 的操作又是另外一回事。这也是我们需要更具描述能力的特性的原因,比如下面这些。
将两个异步计算合并为一个
——
这两个异步计算之间相互独立,同时第二个又依赖于第 一个的结果