本文代码内容来自:https://www.bilibili.com/video/BV1nA411g7d2/?spm_id_from=333.788
一、supplyAsync是什么?
CompletableFuture是Java 8引入的一个异步编程工具,它可以帮助我们更方便地进行并发编程和异步编程。supplyAsync是CompletableFuture类中的一个方法,用于在新的线程中执行指定的任务,并返回计算结果。
具体来说,supplyAsync方法接受一个Supplier类型的参数,该Supplier用于产生计算结果。当调用supplyAsync方法时,它会返回一个CompletableFuture对象,该对象会在新的线程中执行Supplier所指定的计算,并将计算结果保存在CompletableFuture对象中。
二、解析
1.代码
public class SmallTool {
public static void sleepMillis(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void printTimeAndThread(String tag) {
String result = new StringJoiner("\t|\t")
.add(String.valueOf(System.currentTimeMillis()))
.add(String.valueOf(Thread.currentThread().getId()))
.add(Thread.currentThread().getName())
.add(tag)
.toString();
System.out.println(result);
}
}
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.相关分析
-
程序开始执行,调用
SmallTool.printTimeAndThread("小白进入餐厅")
和SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭")
打印小白进入餐厅和点菜的信息。 -
接着创建了一个 CompletableFuture 对象 cf1,通过
CompletableFuture.supplyAsync
方法实现了厨师炒菜的异步操作。当 CompletableFuture 的计算完成后,会立即执行thenCompose
中的操作,也就是服务员打饭的异步操作。 -
在厨师炒菜的过程中,小白在打王者,程序会执行
SmallTool.printTimeAndThread("小白在打王者")
打印相关信息。 -
最后通过
cf1.join()
获取 CompletableFuture 的结果,并打印出"好了,小白开吃"的信息。
4.自我的相关理解:
CompletableFuture.supplyAsync()
方法用于创建一个异步任务,该任务会在一个新的线程中执行。因此,当调用 CompletableFuture.supplyAsync()
时,厨师炒菜的任务就会被提交到一个线程池中去执行。
由于线程池中的线程是并发执行的,所以厨师炒菜的任务和小白在打王者的任务是可以同时进行的。具体来说,在厨师炒菜的任务启动后,程序会立即执行下一行代码,也就是 SmallTool.printTimeAndThread("小白在打王者")
打印小白在打王者的信息。