Future和CompletableFuture区别

这篇具有很好参考价值的文章主要介绍了Future和CompletableFuture区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • Future :获取异步返回的结果需要使用轮询的方式,消耗cup

            ExecutorService executorService = Executors.newFixedThreadPool(10);
    
            Future<String> future = executorService.submit(()->{
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "future";
            });
            while(true){
                if(future.isDone()){
                    System.out.println(future.get());
                    break;
                }
            }
    
  • CompletableFuture:采用观察者模式,阻塞获取异步返回的结果,性能得到优化

    		 System.out.println("=============CompletableFuture===================");
    
    
            CompletableFuture testFuture1 = CompletableFuture.supplyAsync(()->{
                return "丽丽1";
            }).thenApply((element)->{
                System.out.println("testFuture1后续操作:"+element);
                return "丽丽2";
            });
    
            System.out.println(testFuture1.get());
    
    
            System.out.println("=============CompletableFuture===================");
    
    
            CompletableFuture testFuture2 = CompletableFuture.supplyAsync(()->{
                return "丽丽1";
            }).thenAccept((element)->{
                System.out.println("testFuture2后续操作:"+element);
            });
    
            System.out.println(testFuture2.get());
    
  • CompletableFuture的使用明细

    • 官方文档:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/dev/datastream/operators/asyncio
    * runAsync 无返回值
    * supplyAsync 有返回值
    *
    * thenAccept 无返回值
    * thenApply 有返回值
    * thenRun 不关心上一步执行结果,执行下一个操作
    * get() 为阻塞获取 可设置超时时间 避免长时间阻塞
    
    实现接口 AsyncFunction 用于请求分发
    
    定义一个callback回调函数,该函数用于取出异步请求的返回结果,并将返回的结果传递给ResultFuture 
    
    对DataStream的数据使用Async操作
    
    • 例子

      /**
       * An implementation of the 'AsyncFunction' that sends requests and sets the callback.
        *  通过向数据库发送异步请求并设置回调方法
       */
      class AsyncDatabaseRequest extends RichAsyncFunction<String, Tuple2<String, String>> {
      
          /** The database specific client that can issue concurrent requests with callbacks 
           可以异步请求的特定数据库的客户端 */
          private transient DatabaseClient client;
      
          @Override
          public void open(Configuration parameters) throws Exception {
              client = new DatabaseClient(host, post, credentials);
          }
      
          @Override
          public void close() throws Exception {
              client.close();
          }
      
          @Override
          public void asyncInvoke(String key, final ResultFuture<Tuple2<String, String>> resultFuture) throws Exception {
      
              // issue the asynchronous request, receive a future for result
              // 发起一个异步请求,返回结果的 future
              final Future<String> result = client.query(key);
      
              // set the callback to be executed once the request by the client is complete
              // the callback simply forwards the result to the result future
              // 设置请求完成时的回调.将结果传递给 result future
              CompletableFuture.supplyAsync(new Supplier<String>() {
              
                  @Override
                  public String get() {
                      try {
                          return result.get();
                      } catch (InterruptedException | ExecutionException e) {
                          // Normally handled explicitly.
                          return null;
                      }
                  }
              }).thenAccept( (String dbResult) -> {
                  resultFuture.complete(Collections.singleton(new Tuple2<>(key, dbResult)));
              });
          }
      }
      
      // create the original stream
      // 创建一个原始的流
      DataStream<String> stream = ...;
      
      // apply the async I/O transformation
      // 添加一个 async I/O ,指定超时时间,和进行中的异步请求的最大数量
      DataStream<Tuple2<String, String>> resultStream =
          AsyncDataStream.unorderedWait(stream, new AsyncDatabaseRequest(), 1000, TimeUnit.MILLISECONDS, 100);
      
      
    • 注意事项文章来源地址https://www.toymoban.com/news/detail-662574.html

      • Timeout:定义请求超时时间,异步请求多久没完成会被认为是超时了
      • Capacity:定义了同时进行的异步请求的数量,可以限制并发请求数量,不会积压过多的请求
      • 超时处理:默认当一个异步 I/O 请求超时时,会引发异常并重新启动作业。 如果要处理超时,可以覆盖该AsyncFunction的timeout方法来自定义超时之后的处理方式
      • 响应结果的顺序:AsyncDataStream包含两种输出模式,
        • unorderedWait无序:响应结果的顺序与异步请求的顺序不同
        • orderedWait有序:响应结果的顺序与异步请求的顺序相同

到了这里,关于Future和CompletableFuture区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线程池创建线程异步获取Future超时

    其中,future.get是从开始进行get方法时进行计算的时间,非future生成开始计算的,即什么时候get什么时候开始计时。 线程池从生成线程,如果核心线程不为0,则有任务时一直生成核心线程,直至到核心线程,之后开始方队列中,最后任务多就开始开辟新线程到最大线程数。

    2024年02月02日
    浏览(37)
  • C++ 多线程编程(三) 获取线程的返回值——future

    C++11标准库增加了获取线程返回值的方法,头文件为future,主要包括 future 、 promise 、 packaged_task 、 async 四个类。 那么,了解一下各个类的构成以及功能。 future是一个模板类,它是传输线程返回值(也称为 共享状态 )的媒介,也可以理解为线程返回的结果就安置在future中。

    2024年02月02日
    浏览(45)
  • 使用多线程执行任务,并获取返回结果,附异步实现

    这里创建了一个包含三个线程的固定线程池 线程池的介绍 根据主机情况实现自定义线程池: 也可以通过继承 ThreadPoolExecutor 类来实现一个自定义线程池工具类。ThreadPoolExecutor 是 Java 标准库中提供的一个线程池实现,通过继承它,我们可以实现自定义的线程池。 下面是一个继

    2024年02月16日
    浏览(39)
  • java多线程异步处理并获取处理后的返回值

    示例部分代码:

    2024年02月06日
    浏览(43)
  • 异步编程 - 04 基于JDK中的Future实现异步编程(上)_Future & FutureTask 源码解析

    这里我们主要探讨如何使用JDK中的Future实现异步编程,这包含 如何使用FutureTask实现异步编程及其内部实现原理; 如何使用CompletableFuture实现异步编程及其内部实现原理, 以及CompletableFuture与JDK Stream如何完美结合的。 在Java并发包(JUC包)中Future代表着异步计算结果,Future中

    2024年02月09日
    浏览(34)
  • CompletableFuture异步优化代码

    我们在项目开发中,有可能遇到一个接口需要调用N个服务的接口。比如用户请求获取订单信息,需要调用用户信息、商品信息、物流信息等接口,最后再汇总数据统一返回。如果使用串行的方法按照顺序挨个调用接口,这样接口的响应的速度就很慢。如果并行调用接口,同时

    2024年02月08日
    浏览(44)
  • CompletableFuture异步回调

    CompletableFuture简介 CompletableFuture被用于异步编程,异步通常意味着非阻塞,可以使得任务单独允许在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常信息。 CompletableFuture实现了Future,CompletionStage接口,实现了Future接

    2024年02月05日
    浏览(36)
  • CompletableFuture异步任务编排使用

    runAsync(runnable):无返回值 runAsync(runnable, executor):无返回值,可自定义线程池 supplyAsync(runnable):有返回值 supplyAsync(runnable, executor):有回值,可自定义线程池 相关代码演示: 解析:oneFuture.join()获取的执行结果为null,因为runAsync是没有返回结果的。 allOf(future1,future2,future3…):

    2024年02月04日
    浏览(36)
  • CompletableFuture异步关于异常的坑

    写一个存在异常的程序,让其异步执行 结果:接口返回成功,控制台没有打印错误信息。 结果:接口返回失败,控制台打印异常日志。 异步方法中get()是阻塞的,在使用时要设置超时时间。 结果:接口返回成功,控制台打印异常信息。 结果:接口返回成功,控制台打印异步

    2024年02月08日
    浏览(38)
  • 循环异步调取接口使用数组promiseList保存,Promise.all(promiseList)获取不到数组内容,then()返回空数组

    在使用 vue + vant@2.13.2 技术栈的项目中,因为上传文件的接口是单文件上传,当使用批量上传时,只能循环调取接口;然后有校验内容:需要所有文件上传成功后才能保存,在文件上传不成功时点击保存按钮,则提示信息: \\\"文件上传未成功!\\\" 。 我使用 for 循环调取接口,然

    2024年01月18日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包