CompletableFuture类自 身提供了大量精巧的工厂方法,使用这些方法能更容易地完成整个流程,还不用担心实现的细节。
public Future<Double> getPriceAsync(String product) {
//创建CompletableFuture 对象,它会包含计算的结果
CompletableFuture<Double> futurePrice = new CompletableFuture<>();
//在另一个线程中以异步方式执行计算
new Thread(() -> {
double price = calculatePrice(product);
//需长时间计算的任务结 束并得出结果时,设置 Future的返回值
futurePrice.complete(price);
}).start();
// 无需等待还没结束的计算,直接返回Future对象
return futurePrice;
}
采用supplyAsync方法后,你可以用一行语句重写上面的getPriceAsync方 法,如下所示。
public Future<Double> getPriceAsync(String product) {
return CompletableFuture.supplyAsync(() -> calculatePrice(product));
}
upplyAsync方法接受一个生产者(Supplier)作为参数,返回一个CompletableFuture对象,该对象完成异步执行后会读取调用生产者方法的返回值。生产者方法会交由ForkJoinPool 池中的某个执行线程(Executor)运行,但是你也可以使用supplyAsync方法的重载版本,传 递第二个参数指定不同的执行线程执行生产者方法。