为什么要用CompletableFuture?
解决。在future.get()的地方等待future是同步操作。如果使用isDone()方法进行循环判 又太费时费力
public class Test {
public static void main(String[] args) throws InterruptedException {
MoneyServiceImpl MoneyServiceImpl=new MoneyServiceImpl();
MoneyServiceImpl.addMoney(100).whenComplete((result,exc)->{
if (exc == null) {
System.out.println("结果为"+result);
} else {
System.out.println("发生异常"+exc);
}
});
System.out.println("主线程执行结束");
//这里是为了暂缓让主线程退出,让结果可以打印出来
Thread.sleep(30000);
}
}
主线程来调用异步方法,CompletableFuture的whenComplete方法用来接受返回或者异常
方法实现:
public class MoneyServiceImpl implements MoneyService {
@Override
public CompletableFuture<String> addMoney(int money) throws InterruptedException {
return CompletableFuture.supplyAsync(()->{
try {
System.out.println("成功增加"+money);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "第一步完成";
}).thenApplyAsync(new Function<String, String>() {
@Override
public String apply(String lastResult) {
//这里的入参是上一步的结果
System.out.println(lastResult);
return "扣减了"+money;
}
});
}
@Override
public CompletableFuture<String> subMoney(int money) throws InterruptedException {
return CompletableFuture.supplyAsync(()->{
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "成功扣减"+money;
});
}
}
其中
thenApplyAsync方法将上一个线程的结果传递下一个线程,继续异步执行