首页 > 编程语言 >java中的CompletableFuture的实现异步操作的基本介绍

java中的CompletableFuture的实现异步操作的基本介绍

时间:2023-03-25 14:58:35浏览次数:43  
标签:异步 return java System CompletableFuture println 线程 out

CompletableFuture类中,存在四种异步操作方法:

第一种:
public static CompletableFuture<Void> runAsync(Runnable runnable) {
        return asyncRunStage(ASYNC_POOL, runnable);
}


第二种:
public static CompletableFuture<Void> runAsync(Runnable runnable,
                                                   Executor executor) {
        return asyncRunStage(screenExecutor(executor), runnable);
}

这两种都是以run开头的(async表示异步),可以看出,这两个静态方法都没有返回值

第三种:
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
       return asyncSupplyStage(ASYNC_POOL, supplier);
}

第四种:
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
                                                       Executor executor) {
        return asyncSupplyStage(screenExecutor(executor), supplier);
}

三四两种都是存在返回值的,也就是可以获取到线程执行的结果。

 
 
 
示例代码(使用的是存在返回值的实例):

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
                    System.out.println("当前线程为:" + Thread.currentThread().getId());
                    System.out.println("执行的结果为:" + 12);
                    return 12;
                }, service) //service为创建的线程池对象
`//在执行之后异步调用的方法(只能感知到异常,但不能返回值)`
                .whenCompleteAsync((integer, throwable) -> System.out.println("调用完成了"+integer))
//该方法的作用是在线程执行之后存在异常执行的,并可以返回一个值作为线程返回的结果(赋一个默认值)
                .exceptionally((throwable -> {
                    System.out.println("出现的异常为:"+throwable);
                    return 9;//返回一个默认值
                }));
//其中的第一个参数为线程执行之后的返回值,第二个参数为执行过程中出现的异常
//标有async字段的表示异步调用(也就是开启线程执行,不会在该线程中进行执行)
        System.out.println("main方法结束");

执行结果:

 
如果需要在感知到异常出现的同时返回结果,可以使用handle方法:
示例代码如下:

//whenCompleteAsync方法和exceptionally同时使用的效果等同于handle方法的作用(也就是无论是否感知到出现异常的同时进行返回值)
        CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {
                    System.out.println("当前线程为:" + Thread.currentThread().getId());
                    System.out.println("执行的结果为:" + 12);
                    return 12;
                }, service)
                .handle((result, exc) -> {
                    if (result != null) {
                        //也就是没有出现异常(出现异常结果为null)
                        return result + 2;  //使用+2表示进行业务处理
                    }
                    if (exc != null) return 0;//返回一个默认值
                    return 0;
                });

 
 
使用CompletableFuture类的好处是可以将线程进行串行化:
具体的方法有:

标签:异步,return,java,System,CompletableFuture,println,线程,out
From: https://www.cnblogs.com/just1t/p/17216252.html

相关文章

  • java——Zookeeper学习——zk概览转载
    一、ZooKeeper简介ZooKeeper是一个分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。1.1、数据结构ZooKeeper......
  • .net异步处理BackgroundWorker
    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在UI线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算......
  • Java使用IntelliJ IDEA创建控制台程序并通过JDBC连接到数据库
    1、创建一个java控制台程序并测试首先,直接新建一个默认的空的Java模块即可,随便取个名字在src目录下右键->新建->创建一个包,随便取个名字在包中创建一个Test类,写个helloworld......
  • Java使用IntelliJ IDEA创建一个基于Swing的GUI图形化程序,打包发布为jar
    1、创建GUI窗体首先,直接新建一个默认的空的Java模块即可,随便取个名字之后再src目录下右键,新建,创建一个Swing的GUI窗体,随便取个名字给主窗体改个名字到java代码中生成一个窗......
  • java学习日记20230325-模版设计模式
    模版设计模式利用多态的动态绑定,将通用的方法设计为模版抽象类,通过子类继承重写抽象方法实现模版调用。 父类抽象类abstractpublicclassTemplate{......
  • .net异步编程中async 和await深入理解
    1、await运算符应用于异步方法中的任务,在方法的执行中插入挂起点,直到所等待的任务完成。任务表示正在进行的工作。2、await仅可用于由async关键字修改的异步方法中。使......
  • Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用a
    场景Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类:Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解......
  • Java开发 - ELK初体验
    前言前面我们讲过消息队列,曾提到消息队列也具有保存消息日志的能力,今天要说的EL看也具备这个能力,不过还是要区分一下功能的。消息队列的日志主要指的是Redis的AOF,实际上只是......
  • Java - 配置中心初体验
    目录前言配置中心介绍什么是配置中心Nacos配置中心数据结构命名空间分组服务配置中心添加配置读取配置本地添加依赖本地添加配置测试结语前言前文讲了ELK,ELK说简单也简单,说......
  • Java获取IP和MAC值
    importjava.net.InetAddress;importjava.net.NetworkInterface;importjava.net.SocketException;importjava.net.UnknownHostException;publicclassMacAndIpAdd......