简单介绍:
Java 8 中, 新增加了一个包含 50 个方法左右的类–CompletableFuture,它提供了非常强大的 Future 的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。
对于阻塞或者轮询方式,依然可以通过 CompletableFuture 类的 CompletionStage 和 Future 接口方式支持。
CompletableFuture 类声明了 CompletionStage 接口,CompletionStage 接口实际上提供了同步或异步运行计算的舞台,所以我们可以通过实现多个 CompletionStage 命令,并且将这些命令串联在一起的方式实现多个命令之间的触发。
我们可以通过 CompletableFuture.supplyAsync(this::sendMsg); 这么一行代码创建一个简单的异步计算。在这行代码中,supplyAsync 支持异步地执行我们指定的方法,这个例子中的异步执行方法是 sendMsg。当然,我们也可以使用 Executor 执行异步程序,默认是 ForkJoinPool.commonPool()。
我们也可以在异步计算结束之后指定回调函数,例如 CompletableFuture.supplyAsync(this::sendMsg) .thenAccept(this::notify);这行代码中的 thenAccept 被用于增加回调函数。
1、CompletableFuture 可以等待一个命令到达后再继续工作:
final CompletableFuture<String> futrue = new CompletableFuture<>();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 等待命令下发:。。。");
try {
String cmd = futrue.get(2, TimeUnit.SECONDS);
System.out.println(Thread.currentThread().getName() + " 收到命令:" + cmd);
} catch (Exception e) {
System.out.println("超过等待时间未收到命令:放弃任务!");
e.printStackTrace();
}
}).start();
;
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + " 下发命令:开始进攻!!!" );
futrue.complete("开始进攻!!!");
输出结果:
2、可以在一个任务完成后再开始下一个任务:
String result = CompletableFuture.supplyAsync(() -> {
TimeUnit.SECONDS.sleep(1);
return "Hello : ";
}).thenApplyAsync(v -> v + "world!").join();
System.out.println(result);
输出结果:Hello : world!