CompletableFuture基础使用方法
文章目录
前言
如何利用Java1.8中的CompletableFuture实现多线程操作
提示:以下是本篇文章正文内容,下面Demo可供参考,具体业务场景需要进一步扩展
一、CompletableFuture是什么?
CompletableFuture在Java里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息
二、本次演示Demo场景
大熊去餐厅吃饭,点了红烧肉和米饭,然后看着电视剧等红烧肉和米饭送来,菜上以后,大熊开吃
二、代码实现
1.创建本次测试使用的工具类SmallTool
代码如下(示例):
import java.util.StringJoiner;
/**
* @ClassName SmallTool
* @Description 多线程测试使用工具
* @Author 码头土夫子_Gao
* @Date 2021/11/24 14:40
* @Version 1.0
**/
public class SmallTool {
public static void sleepMillis(long mills) {
try {
Thread.sleep(mills);
} 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);
}
}
2.创建测试类CompletableFutureTest
代码如下(示例):
import java.util.concurrent.CompletableFuture;
/**
* @ClassName test3
* @Description CompletableFuture 测试
* @Author 码头土夫子_Gao
* @Date 2021/11/24 15:08
* @Version 1.0
**/
public class CompletableFutureTest {
public static void main(String[] args) {
SmallTool.printTimeAndThread("大熊进入餐厅");
SmallTool.printTimeAndThread("大熊点了 红烧肉 + 一碗米饭");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
SmallTool.printTimeAndThread("厨师炒红烧肉");
SmallTool.sleepMillis(200);
SmallTool.printTimeAndThread("厨师打饭");
SmallTool.sleepMillis(100);
return "番茄炒蛋 + 米饭 做好了";
});
SmallTool.printTimeAndThread("大熊在看新世界电视剧");
SmallTool.printTimeAndThread(String.format("%s ,大熊开吃", cf1.join()));
}
}
3.测试结果
时间戳 线程ID 线程名称 消息
4.测试方法分析
/**
* supplyAsync
* public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
* return asyncSupplyStage(asyncPool, supplier);
* }
* Supplier:函数式接口,没有入参,只有一个返回值(对外提供数据)
*/
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
/**
* 当调用CompletableFuture的supplyAsync()后
* 传入Supplier参数中的代码,会在另外一个线程中执行
*/
SmallTool.printTimeAndThread("厨师炒红烧肉");
SmallTool.sleepMillis(200);
SmallTool.printTimeAndThread("厨师打饭");
SmallTool.sleepMillis(100);
return "番茄炒蛋 + 米饭 做好了";
});
SmallTool.printTimeAndThread("大熊在看新世界电视剧");
/**
* CompletableFuture中的join()方法返回值类型就是CompletableFuture的泛型,返回值就是supplier返回值
* join()方法会等待任务的结束,然后返回执行结果
*/
SmallTool.printTimeAndThread(String.format("%s ,大熊开吃", cf1.join()));
总结
以上是CompletableFuture基础使用方法,实际业务需要进一步拓展使用