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

Posted just1t的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的CompletableFuture的实现异步操作的基本介绍相关的知识,希望对你有一定的参考价值。

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类的好处是可以将线程进行串行化:
具体的方法有:

以上是关于java中的CompletableFuture的实现异步操作的基本介绍的主要内容,如果未能解决你的问题,请参考以下文章

Java——聊聊JUC中的CompletableFuture

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

CompletableFuture的使用例子

CompletableFuture的使用例子

Java8 CompletableFuture 总结

CompletableFuture,可变对象和内存可见性