本文介绍CompletableFuture类,开启线程异步执行任务。
参考视频:这个视频讲的很好,一定要去看。。。。。。
【Java并发·03】CompletableFuture入门_哔哩哔哩_bilibili异步编程,原来可以这样简单多线程、异步 是近些年来工作中越来越常用的技术但是有好多同学都停留在 Thread 层面,没有去了解更方便的工具这是制作视屏以来的第三个作品,加入了一些搞笑的元素。希望能让你们轻轻松松学知识-本节课是 CompletableFuture 的入门课讲到了 CompletableFuture 中常用的三个APIsupplyAsync、thenCompose、thenCombihttps://www.bilibili.com/video/BV1nA411g7d2?from=search&seid=18435190904151283503&spm_id_from=333.337.0.0本文,先介绍几个方法,在介绍使用场景,再介绍如何使用,代码地址可以在视频中获取,也可以访问下面的地址:都是视频作者的,代码很好,还需要自己理解share-concurrent: Java并发编程 视屏教程 相关源码https://gitee.com/phui/share-concurrent
supplyAsync
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
return asyncSupplyStage(asyncPool, supplier);
}
这个是提交一个任务,开启异步执行,返回执行结果,这个方法和runAsync()---没有返回值,可以比较学习。
使用代码:
package com.example.demo2.cusdemo.futruedemo;
import com.example.demo2.cusdemo.SmallTool;
import java.util.concurrent.CompletableFuture;
public class TestCompletable {
public static void main(String[] args) {
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
System.out.println("执行任务");
return "任务执行结果";
});
System.out.println("结果===" + cf1.join());
}
}
这个很简单,就是把要执行的任务,放到参数里就行了。
thenCompose
public <U> CompletableFuture<U> thenCompose(
Function<? super T, ? extends CompletionStage<U>> fn) {
return uniComposeStage(null, fn);
}
这个可以链式写法,入参,需要传一个function。看代码
public static void main(String[] args) {
SmallTool.printTimeAndThread("小白进入餐厅");
SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
SmallTool.printTimeAndThread("厨师炒菜");
SmallTool.sleepMillis(200);
return "番茄炒蛋";
}).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
SmallTool.printTimeAndThread("服务员打饭");
SmallTool.sleepMillis(100);
return dish + " + 米饭";
}));
SmallTool.printTimeAndThread("小白在打王者");
SmallTool.printTimeAndThread(String.format("%s 好了,小白开吃", cf1.join()));
}
这个是将上一个任务执行的结果传入下一个任务。这可以看成2个任务的连接,一个接一个的执行。再看执行结果
这个使用场景,下单支付---支付完成后需要发消息修改订单状态; 这个支付任务分3个,1支付,2接收支付成功后发消息,3修改状态;
代码写法
public static void main(String[] args) {
System.out.println("订单支付进入");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
System.out.println("开始支付--调用支付接口");
SmallTool.sleepMillis(200);
return "支付完成";
}).thenCompose(success -> CompletableFuture.supplyAsync(() -> {
if("支付完成".eques(success)){
System.out.println("发消息");
}
SmallTool.sleepMillis(100);
return "发送成功";
}));
System.out.println("支付结束");
}
这个例子可能不太合适,这样的话,直接让主线程自己执行也行,还可以判断支付的结果。
thenCombine
同时开启多个线程,执行任务,并将返回结果传入执行
applyToEither
多个任务,谁先返回结果,就采用哪个,
场景:询价。询问多个厂家,谁给出价格,就返回上报。
exceptionally
捕获异常。在上边的调用中,有异常发生,会在这里捕获
anyOf
任何一个返回结果就往下执行
详细介绍可以看视频。