`
wx1569484809
  • 浏览: 63709 次
文章分类
社区版块
存档分类
最新评论

初探 CompletableFuture Java8新的异步编程方式

 
阅读更多
  1. 序言

       由于项目中想获取多个异步线程的状态,并判断其是否都执行完成,若执行完成后则做后续操作,经同事提醒java8 中CompletableFuture这个可以完美解决项目问题,故借此机会学习了下,记录下涉及到的知识点,以便后期回顾。

  1. CompletableFuture

        2.1 Async结尾的方法都是可以异步执行的,如果指定了线程池,会在指定的线程池中执行,如果没有指定,默认会ForkJoinPool.commonPool()中执行。

     runAsync方法:它以Runnabel函数式接口类型为参数,所以CompletableFuture的计算结果为空。

    supplyAsync方法以Supplier<U>函数式接口类型为参数,CompletableFuture的计算结果类型为U。

方法    描述
static CompletableFuture<Void> runAsync(Runnable runnable) 返回一个新的CompletableFuture,它在运行给定操作后由运行在 ForkJoinPool.commonPool()中的任务 异步完成
static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) 返回一个新的CompletableFuture,它在运行给定操作后在给定的线程池中运行的任务异步完成异步完成
static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) 返回一个新的CompletableFuture,它通过在 ForkJoinPool.commonPool()中运行的任务与通过调用给定的供应商获得的值 异步完成
static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) 返回一个新的CompletableFuture,由给定执行器中运行的任务异步完成,并通过调用给定的供应商获得的值
  //1. 返回一个新的CompletableFuture,它在运行给定操作后由运行在 ForkJoinPool.commonPool()中的任务 异步完成。
        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()-> {
            System.out.println(" completableFuture1 is not nothing");
        });
        //2. 返回一个新的CompletableFuture,它在运行给定操作后在给定的线程池中运行的任务异步完成异步完成。
        CompletableFuture<Void> completableFuture2 = CompletableFuture.runAsync(()-> {
            System.out.println(" completableFuture2 is not nothing");
        },Executors.newSingleThreadExecutor());

       //3. 返回一个新的CompletableFuture,它通过在 ForkJoinPool.commonPool()中运行的任务与通过调用给定的供应商获得的值 异步完成。
        CompletableFuture<Object> completableFuture3 = CompletableFuture.supplyAsync(()-> {
                    return "hello completableFuture3";
                });
       //4. 返回一个新的CompletableFuture,由给定执行器中运行的任务异步完成,并通过调用给定的供应商获得的值。
        CompletableFuture<Object> completableFuture4 = CompletableFuture.supplyAsync(()-> {
            return "hello completableFuture4";
        },Executors.newSingleThreadExecutor());

        System.out.println(completableFuture3.get());
        System.out.println(completableFuture4.get());

   2.2 allOf 、 anyOf

方法 描述
static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) 返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时,完成。 
 执行完所有提交任务后进行后面的操作,无返回值
static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)   返回一个新的CompletableFuture,当任何一个给定的CompletableFutures完成时,完成相同的结果。用于有返回值的,当任一执行完立即返回结果
 CompletableFuture<Object> completableFuture5 = CompletableFuture.supplyAsync(()-> {
            return "hello completableFuture5";
        });
        CompletableFuture<Object> completableFuture6 = CompletableFuture.supplyAsync(()-> {
            return "hello completableFuture6";
        },Executors.newSingleThreadExecutor());

        // allOf 若后面没有加join(),那么void1和void2将异步执行,这里不会阻塞,也就拿不到执行结果
        CompletableFuture.allOf(completableFuture5,completableFuture6)
                .thenRun(()->{
                    System.out.println("hello allof");
                }).join();

        List<CompletableFuture> completableFutureList = new ArrayList<>();
        completableFutureList.add(completableFuture5);
        completableFutureList.add(completableFuture6);
         // 方式一
        // completableFuture5 和 completableFuture6都执行完成后,输出对应的结果
        CompletableFuture<Void> res = CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]));

        CompletableFuture<List<Object>> result = res.thenApply(v ->{
             return  completableFutureList.stream()
                    .map(CompletableFuture::join)
                    .collect(Collectors.toList());
                }
        );
         System.out.println(result.get());
        // 方式二
        List<Object> result2 = Stream.of(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]))
                .map(CompletableFuture::join)
                .collect(Collectors.toList());
        System.out.println(result2);

        // completableFuture5 和 completableFuture6 随机的,只要某个执行完成就会结束并返回结果。
        CompletableFuture<Object> anyof = CompletableFuture.anyOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]));
        System.out.println(anyof.get());

2.3 CompletableFuture 异常处理

CompletableFuture在运行时如果遇到异常,可以使用get()并抛出异常进行处理,但这并不是一个最好的方法。CompletableFuture本身也提供了几种方式来处理异常

方法 描述

exceptionally(Function<Throwable,? extends T> fn)

只有当CompletableFuture抛出异常的时候,才会触发这个exceptionally的计算,调用function计算值。
 CompletableFuture<String> completableFuture7 = CompletableFuture.supplyAsync(()-> {
            int m = 1/0;
            return "hello completableFuture7";
        }).exceptionally(ex->{
            return ex.getMessage();
        });
        System.out.println(completableFuture7.get());

 

转载于:https://my.oschina.net/u/3370769/blog/3070033

分享到:
评论

相关推荐

    Twisted与异步编程入门

    #### 异步编程模式与Reactor初探 文档接下来转向Twisted的核心组件——Reactor。Reactor是Twisted中的事件循环机制,负责监听来自网络连接的事件,并将这些事件分发给相应的回调函数处理。 - **Reactor的工作原理*...

    基于计算机软件开发的JAVA编程应用初探.pdf

    在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...

    基于计算机软件开发的JAVA编程应用初探.zip

    这份资料"基于计算机软件开发的JAVA编程应用初探"将引领我们深入理解Java在软件开发中的核心概念、应用领域以及实战技巧。 首先,Java的基础知识是学习的重点。Java是一种强类型、静态类型的编程语言,它的语法与...

    .Net异步编程(async await)初探

    针对.net异步编程(async await)使用入门的一些讲解

    基于Java的开源GIS编程教学初探.pdf

    本文所探讨的“基于Java的开源GIS编程教学初探”正是为了满足这一教学需求,通过实践教学的方式,培养学生利用Java语言进行开源GIS编程的综合能力。 Java语言作为一门成熟稳定的编程语言,在开源软件开发领域拥有...

    Java高级编程课程思政案例教学初探.pdf

    Java高级编程课程思政案例教学初探.pdf

    Java高级编程课程思政案例教学初探.zip

    Java高级编程课程思政案例教学初探,是一个深入探讨如何将思想政治教育融入到Java高级编程教学中的主题。在当前的教育环境中,强调立德树人,将思政元素与专业课程相结合,旨在培养具备良好品德和社会责任感的IT人才...

    计算机软件开发中Java编程语言的应用初探.pdf

    "计算机软件开发中Java编程语言的应用初探" 计算机软件开发中Java编程语言的应用初探是计算机软件开发的重要组成部分,Java编程语言是一种广泛使用的编程语言,具有许多优点和特征,使其在软件开发中应用非常广泛。...

    计算机软件开发中JAVA编程语言及其实际应用.pdf

    Java作为一种编程语言,在计算机软件开发领域占据了重要的地位。它以其多线程能力、平台无关性以及在实际应用中的广泛运用而备受瞩目。 首先,Java的多线程特征是其一大亮点。在Java中,多线程意味着多个任务可以...

    Java本地接口工作方式初探

    Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...

    初探WSDL2JAVA工具的使用

    ### 初探WSDL2JAVA工具的使用:深入解析与实践指南 在现代软件开发领域,Web服务(WebService)已成为企业级应用间进行交互的重要手段。Web服务定义语言(WSDL,Web Service Definition Language)是一种基于XML的...

    基于Java的开源GIS编程教学初探.zip

    在Java编程环境中,有许多开源GIS库可供开发者使用,这使得Java成为GIS开发的一个强大平台。本教程将探讨如何利用Java进行开源GIS编程,以实现地理数据的处理和应用开发。 一、Java GIS框架 1. GeoTools:GeoTools...

    C#基础系列:异步编程初探async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友说到了async, await等新语法。确实,没有异步的多线程是单调的、乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便...

    eclipse 下实现java JNI 初探

    这篇博客"eclipse 下实现java JNI 初探"将引导我们了解如何在Eclipse环境中开发和使用JNI。 首先,我们需要了解JNI的基本概念。JNI为Java程序员提供了一种方式来编写可以调用本地(非Java)代码的Java方法。这些...

    Java NIO 网络编程初探

    Java NIO 网络编程初探 1. Java NIO Java 1.4 版本添加了一个新的IO API,称为NIO(New IO)。NIO拥有所有IO的功能,但是操作方法却完全不一样。NIO支持面向缓冲区的、基于通道的IO操作。能够更加高效的进行IO操作。...

    Java-program-design-.rar_Java 8

    Java 8是Java编程语言的一个重要版本,引入了许多新特性,极大地提升了开发效率和代码的可读性。在这个压缩包中,"Java-program-design-.rar_Java 8"包含了关于学习和理解Java 8编程的一系列电子教程。下面将详细...

    Java教学方法初探.pdf

    Java教学方法初探 ...Java教学方法初探强调了学习兴趣的培养、实例化教学、实例化先果后因式教学和重编程思想而轻语法等几个重要的教学方法,旨在提高学生的学习兴趣和应用知识能力,达到教学效果的最优化。

    初探Java FX一个小系统企业员工系统

    【初探Java FX:构建小系统企业员工系统】 Java FX是一个强大的、用于创建桌面应用程序的图形用户界面(GUI)框架,它提供了丰富的视觉组件和高度定制的样式,使得开发者能够构建出美观且功能丰富的应用程序。在...

    基于游戏开发的Java语言教学初探.docx

    8. Java语言在游戏开发中的应用:Java语言可以用来开发游戏,游戏开发需要掌握Java语言的基础知识和游戏开发的相关知识。 9. 网页游戏的发展前景:网页游戏的发展前景非常广阔,中国市场是一个大市场,它支持所有有...

    Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

    通过阅读《Netty初探:掌握高性能网络通信框架,提升Java网络编程技能》这本书,你将深入了解这些概念,并学会如何运用Netty构建实际的网络应用,提升你的Java编程技能。这本书会逐步引导你从基础知识到高级特性的...

Global site tag (gtag.js) - Google Analytics