import java . util . concurrent . ExecutionException ; import java . util . concurrent . ExecutorService ; import java . util . concurrent . Executors ; import java . util . concurrent . Future ; * @author djh on 2019/4/22 10:23 * @E-Mail 1544579459@qq.com public class Demo { public static void main ( String [ ] args ) throws ExecutionException , InterruptedException { ExecutorService cachePool = Executors . newCachedThreadPool ( ) ; Future < String > future = cachePool . submit ( ( ) - > { Thread . sleep ( 3000 ) ; return "异步任务计算结果!" ; } ) ; // 提交完异步任务后, 主线程可以继续干一些其他的事情. doSomeThingElse ( ) ; // 为了获取异步计算结果, 我们可以通过 future.get 和 轮询机制来获取. String result ; // Get 方式会导致当前线程阻塞, 这显然违背了异步计算的初衷. // result = future.get(); // 轮询方式虽然不会导致当前线程阻塞, 但是会导致高额的 CPU 负载. long start = System . currentTimeMillis ( ) ; while ( true ) { if ( future . isDone ( ) ) { break ; System . out . println ( "轮询耗时:" + ( System . currentTimeMillis ( ) - start ) ) ; result = future . get ( ) ; System . out . println ( "获取到异步计算结果啦: " + result ) ; cachePool . shutdown ( ) ; private static void doSomeThingElse ( ) { try { Thread . sleep ( 1000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; System . out . println ( "我的最重要的事情干完了, 我要获取异步计算结果来执行剩下的事情." ) ;
我的最重要的事情干完了, 我要获取异步计算结果来执行剩下的事情.
轮询耗时:2000
获取到异步计算结果啦: 异步任务计算结果!
Process finished with exit code 0

从上面的 Demo 中我们可以看出, future 在执行异步任务时, 对于结果的获取显的不那么优雅, 很多第三方库就针对 Future 提供了回调式的接口以用来获取异步计算结果, 如Google的: ListenableFuture, 而 Java8 所提供的 CompleteFuture 便是官方为了弥补这方面的不足而提供的 API.

下面简单介绍用法:
package demos;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 * @author djh on  2019/5/1 20:26
 * @E-Mail 1544579459@qq.com
public class CompleteFutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> completableFutureOne = new CompletableFuture<>();
        ExecutorService cachePool = Executors.newCachedThreadPool();
        cachePool.execute(() -> {
            try {
                Thread.sleep(3000);
                completableFutureOne.complete("异步任务执行结果");
                System.out.println(Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
        });
        // WhenComplete 方法返回的 CompletableFuture 仍然是原来的 CompletableFuture 计算结果.
        CompletableFuture<String> completableFutureTwo = completableFutureOne.whenComplete((s, throwable) -> {
            System.out.println("当异步任务执行完毕时打印异步任务的执行结果: " + s);
        });
        // ThenApply 方法返回的是一个新的 completeFuture.
        CompletableFuture<Integer> completableFutureThree = completableFutureTwo.thenApply(s -> {
            System.out.println("当异步任务执行结束时, 根据上一次的异步任务结果, 继续开始一个新的异步任务!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            return s.length();
        });
        System.out.println("阻塞方式获取执行结果:" + completableFutureThree.get());
        cachePool.shutdown();

从上面的 Demo 中我们主要需要注意 thenApply 和 whenComplete 这两个方法, 这两个方法便是 CompleteFuture 中最具有意义的方法, 他们都会在 completeFuture 调用
complete 方法传入异步计算结果时回调, 从而获取到异步任务的结果.

相比之下 future 的阻塞和轮询方式获取异步任务的计算结果, CompleteFuture 获取结果的方式就显的优雅的多.

更多详细用法: https://colobu.com/2016/02/29/Java-CompletableFuture/

Java8 中的 completeFuture 是对 Future 的扩展实现, 主要是为了弥补 Future 没有相应的回调机制的缺陷. 我们先看看 Java8 之前的 Future 的使用:package demos;import java.util.concurrent.ExecutionException;import java.util.concurrent.Execu...
CompleteFuture的用法,异步调用,等全部方法执行完获取返回值。 package com.sf.vsolution.hn.fcs; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; 大家好,我是GMaya。 本文是解决一个业务上访问慢的痛点,整体是这样的。有一个汇总微服务a,现在需要调用其他b,c,d等多个微服务接口,然后整体将数据进行整合。如果是串行调用,每个接口需要1秒,那么三个接口也要3秒了。。。 使用CompleteFuture方法,并行调用,然后数据汇总整合。 模拟场景: 1、pay支付微服务有三个接口,每个接口中模拟访问过慢的场景。 2、order分别串行方式和并行方式进行调用。 pay微服务代码 * @ Description :
CompleteFuture实现简单的任务编排实践 ​ CompleteFuturejava8 新提供的API,是对函数式编程思想的体现,提供了很多的对于函数式编程支持。不止有同步处理功能,还有异步处理能力。 通过函数式编程可以实现线程的简单任务编排。高效,整洁实现多线程异步编程。 二:详细介绍 ​ CompleteFuture 提供的API中以ansy结尾的都是异步处理的。 异步执行任务,并返回结果:supplyAsync 异步处理,并返回结果,默认使用ForkJoinPool.commo
CompletableFuture 这个completableFuture是JDK1.8版本新引入的类。下面是这个类。实现了俩接口。本身是个class。这个是Future的实现类。 使用completionStage接口去支持完成时触发的函数和操作。 一个completetableFuture就代表了一个任务。他能用Future的方法。还能做一些之前说的executorService配合fu...
import java.time.LocalTime; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Java8TimeDemo { public static void main(String[] args) { // 获取当前日期 LocalDate date = LocalDate.now(); System.out.println("当前日期: " + date); // 获取当前时间 LocalTime time = LocalTime.now(); System.out.println("当前时间: " + time); // 获取当前日期时间 LocalDateTime dateTime = LocalDateTime.now(); System.out.println("当前日期时间: " + dateTime); // 格式化日期和时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = dateTime.format(formatter); System.out.println("格式化后的日期时间: " + formattedDateTime); 在这个示例中,我们使用了 `LocalDate`、`LocalTime` 和 `LocalDateTime` 类来表示日期、时间和日期时间,并使用了 `DateTimeFormatter` 类来格式化日期和时间。