首页 > 编程语言 >Java.CompletableFuture使用

Java.CompletableFuture使用

时间:2024-03-11 10:24:08浏览次数:23  
标签:Java executor System CompletableFuture 使用 println return out

使用CompletableFuture替代Thread+Runnable
解决Thread+Runnable没有返回值、串行化和组合任务问题

1、CompletableFuture.runAsync 异步没有返回值
需要传入一个线程池

public static ExecutorService executor = Executors.newFixedThreadPool(10);
CompletableFuture.runAsync(()->{
    System.out.println("当前线程:"+Thread.currentThread().getId());
    int i = 10/2;
    System.out.println("运行结果:"+ i );
},executor);

2、CompletableFuture.supplyAsync 异步有返回值

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    System.out.println("当前线程:" + Thread.currentThread().getId());
    int i = 10 / 2;
    System.out.println("运行结果:" + i);
    return i;
}, executor).handle((res,thr)->
{//结果处理,res 结果,thr 异常
    if(res !=null){
        return res*2;
    }
    if(thr!=null){
        return 0;
    }
        return 0;
});
Integer i = future.get();// 阻塞

3、线程串行化

没有接收结果

/**
* 线程串行化
*/
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    System.out.println("当前线程:" + Thread.currentThread().getId());
    int i = 10 / 2;
    System.out.println("运行结果:" + i);
    return i;
}, executor).thenRunAsync(() -> {
    System.out.println("任务2执行成功");
}, executor);

有接收结果

CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    System.out.println("当前线程:" + Thread.currentThread().getId());
    int i = 10 / 2;
    System.out.println("运行结果:" + i);
    return i;
}, executor).thenAcceptAsync((res)->{
    System.out.println("任务2启动了.."+res);
},executor);

接收结果,并修改返回结果

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    System.out.println("当前线程:" + Thread.currentThread().getId());
    int i = 10 / 2;
    System.out.println("运行结果:" + i);
    return i;
}, executor).thenApplyAsync((res) -> {
    System.out.println("任务2启动了...");
    return "hello " + res;
}, executor);
String s = future.get(); // 阻塞

4、组合任务-都要完成

需等组合任务完成,第三个线程才开始

CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务1启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务2启动了...");
    return 5;
}, executor);

future01.runAfterBothAsync(future02,()->{
    System.out.println("任务3开始...");
},executor);

组合任务都完成,感知结果

CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务1启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务2启动了...");
    return 5;
}, executor);

future01.thenAcceptBothAsync(future02,(f1,f2)->{
    System.out.println("任务3开始...之前的结果:"+f1+"-> "+ f2);
},executor);

组合任务都完成,感知结果,并重新返回值

CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务1启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务2启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future = future01.thenCombineAsync(future02, (f1, f2) -> {
    System.out.println("任务3开始...之前的结果:" + f1 + "-> " + f2);
    return f1 + f2;
}, executor);

Integer i = future.get();

5、组合任务-一个完成

两个任务,只要有一个完成,我们就执行任务3。

没有感知结果,没有返回值

CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务1启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(3000);
        System.out.println("任务2启动了...");
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return 5;
}, executor);

future01.runAfterEitherAsync(future02,()->{
    System.out.println("任务3启动了...");
},executor);        

感知结果

CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务1启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(3000);
        System.out.println("任务2启动了...");
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return 5;
}, executor);

/**
* 需相同返回类型
*/
future01.acceptEitherAsync(future02,(res)->{
    System.out.println("任务3启动了...");
},executor);

感知结果,并且有返回值

CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
    System.out.println("任务1启动了...");
    return 5;
}, executor);

CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(3000);
        System.out.println("任务2启动了...");
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }    
    return 5;
}, executor);

/**
* 需相同返回类型
*/
CompletableFuture<Integer> future = future01.applyToEitherAsync(future02, (res) -> {
    System.out.println("任务3启动了...");
    return res + 1;
}, executor);

Integer i = future.get();

6、多任务组合(常用)

allOf:等待所有任务完成

anyOf:只要有一个任务完成

allOf,等待所有任务完成

CompletableFuture<String> futureImg = CompletableFuture.supplyAsync(() -> {
    System.out.println("查询商品的图片信息");
    return "hello.jpg";
}, executor);

CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {
    System.out.println("查询商品的属性");
    return "黑色+256G";
}, executor);

CompletableFuture<String> futureDesc = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    System.out.println("查询商品介绍");
    return "华为";
}, executor);

CompletableFuture<Void> allOf = CompletableFuture.allOf(futureImg, futureAttr, futureDesc);
allOf.get(); // 阻塞等待所有线程完成
String s = futureImg.get();
String s1 = futureAttr.get();
String s2 = futureDesc.get();

anyOf,只要有一个任务完成

CompletableFuture<String> futureImg = CompletableFuture.supplyAsync(() -> {
    System.out.println("查询商品的图片信息");
    return "hello.jpg";
}, executor);

CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {
    System.out.println("查询商品的属性");
    return "黑色+256G";
}, executor);

CompletableFuture<String> futureDesc = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    System.out.println("查询商品介绍");
    return "华为";
}, executor);     

CompletableFuture<Object> anyOf = CompletableFuture.anyOf(futureImg, futureAttr, futureDesc);
anyOf.get(); // 阻塞等待所有线程完成

 

原文链接:https://blog.csdn.net/qq_29385297/article/details/127500636

标签:Java,executor,System,CompletableFuture,使用,println,return,out
From: https://www.cnblogs.com/oumi/p/18065477

相关文章

  • Ubuntu20.04使用apt安装以boost库为基础的开发环境
    1.开启了x11功能的mobaxterm(mobaXterm默认开启了,其他的终端可能还要设置开启)上安装一些必要依赖sudoaptinstalllibxext6libxrender1libxtst6libxi6libfreetype6-ysudoapt-getinstallfonts-droid-fallbackttf-wqy-zenheittf-wqy-microheifonts-arphic-ukaifonts-a......
  • java时间操作
    publicstaticvoidmain(String[]args){LocalDateTimetime=LocalDateTime.of(2022,11,30,6,6,6);DateTimeFormatterof=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");StringdateTime=time.format(of);Syste......
  • CentOS8使用yum报错:Cannot prepare internal mirrorlist: No URLs in mirrorlist
    CentOS8使用yum报错:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist报错信息:错误:为仓库'appstream'下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist 出现这个问题的原因是:在2022年1月31日,CentOS从官方镜像中移除CentOS8的所......
  • 使用 Docker 部署 Fiora 在线聊天室平台
    一、Fiora介绍Fiora简介Fiora是一款开源免费的在线聊天系统。GitHub:https://github.com/yinxin630/fioraFiora功能注册账号并登录,可以长久保存你的数据加入现有群组或者创建自己的群组,来和大家交流和任意人私聊,并添加其为好友多种消息类型,包括文本/表情/图片/......
  • 使用@Autowired + Map 实现策略模式
    创建接口publicinterfaceUserService{StringgetName();}创建多个类实现上面的接口实现一importcom.boot.service.UserService;importorg.springframework.stereotype.Service;@Service("zhangsan")publicclassZhangsanUserServiceImplimplementsUserServ......
  • 并行化优化KD树算法:使用C#实现高效的最近邻搜索
    本文信息中文名:《并行化优化KD树算法:使用C#实现高效的最近邻搜索》英文名:"ParallelizedOptimizationofKD-TreeAlgorithm:ImplementingEfficientNearestNeighborSearchinC#"摘要本文介绍了如何使用并行计算技术优化KD树算法,并使用C#编程语言实现了高效的最近邻......
  • Markdown+Typora使用指南(测试博客)
    Markdown+Typora使用指南(测试博客)这个是我刚学Markdown时参考B站上一个up主(忘记是哪个了)的视频记录的笔记,在这里仅作测试博客园博客使用,后期会删除。目录Markdown+Typora使用指南(测试博客)0.写Markdowm用半角标点1.标题["#"+空格前置]三级标题四级标题五级标题六级标题2.强......
  • Swagger的介绍以及使用
    今天学习了Swagger。Swagger是一个规范且完整的框架,用于生成、描述、调用以及可视化RESTful风格的web服务。其主要的功能:有利于进行前后端分离式开发,有利于团队协作自动生成接口文档,缓解编写接口文档的压力进行功能测试现如今Spring已经将Swagger纳入自身的标准,建立了Spring......
  • pytorch_lightning的使用
    Reference1.【PyTorchLigntning】快速上手简明指南2.PytorchLightning完全攻略3.PyTorchLightning教程四:超参数的使用4.小风_的CSDN......
  • JAVA注解的总结及其作用
    #一、@component标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的<beanid=""class=""/>)。将其扫描注入到Spring容器,注入成Bean#二、@ServerEndpoint(value="/server/{username}")@ServerEndpoint注解用于将一个Java类标记为WebSocket端点,指......