首页 > 其他分享 >Future和CompletableFuture区别

Future和CompletableFuture区别

时间:2023-08-21 22:34:47浏览次数:38  
标签:异步 请求 区别 future CompletableFuture 超时 Future out

  • 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的使用明细

    * 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);
      
      
    • 注意事项

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

标签:异步,请求,区别,future,CompletableFuture,超时,Future,out
From: https://www.cnblogs.com/xietingwei/p/17647249.html

相关文章

  • import 和 require的区别
    import和require是两种用于加载模块的方式,主要区别如下:语法:import是ES6中的模块加载语法,require是Node.js中的模块加载语法。引用方式:import是静态引用,需要在模块的顶部引用,而且不能在代码中动态引用。require则可以在代码的任何地方引用,并且可以根据条件动态引用。导入的内容......
  • react class与hooks区别
    在React中,有两种主要的方式来管理组件的状态和生命周期:Class组件和Hooks。Class组件:Class组件是React最早引入的方式,它是基于ES6class的语法来创建的。Class组件包含了生命周期方法,可以用来处理组件的状态、副作用等。以下是一些Class组件的特点和生命周期方法:特点:使......
  • Nacos与Eureka的区别
    Nacos的服务实例分为两种l类型:临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。 Nacos与eureka的共同点 都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测 N......
  • 珠海先达盈致浅析MOM系统与MES系统的区别
    一、MOM系统与MES系统的区别MOM系统和MES系统是在制造业中较为重要的两类软件管理系统,它们在功能与应用上面有某些差别。MOM系统是一个综合性的的制造运营管理系统,它涵盖从生产计划到加工生产的整个生产制造过程。MOM系统主要关注运营管理,它可以在线监控和控制整个加工生产过程,包......
  • 营销干货 | CPM和oCPM有啥区别?
    我们之前用了三个章节的篇幅,讲明白了广告投放的正确方法、渠道选择,以及什么是全域营销。从本章开始,我们的内容将侧重于一些在广告投放领域需要重点学习、关注的专业术语、方法论,并解答一些来自读者的留言和常见的问题,希望可以助你在从事广告投放、市场营销等相关工作时,事半功倍,业......
  • 云主机与云服务器:两者的区别
    本文分享自天翼云开发者社区《云主机与云服务器:两者的区别》,作者:张****华云主机:云主机是一种通过虚拟化技术在云计算环境中提供的计算资源。它基于物理服务器上的虚拟机实例,可以进行灵活的配置和管理。云主机提供高可用性、弹性扩展和灵活的资源分配,使用户能够根据需求快速调整......
  • 微信小程序中的路由及其区别
    wx.navigateTo():保留当前页面,跳转到应用内的某个页面。但是不能跳到tabbar页面wx.redirectTo():关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到tabbar页面wx.switchTab():跳转到tabBar页面,并关闭其他所有非tabBar页面wx.navigateBack()关闭当前页面,返回上......
  • su - 和 sudo -i 的区别,使用sudo更安全灵活
    su-是切换为root账号,是完全的切换,需要输入root密码,与直接用root进行登录一样,sudo-i看似一样,实则非常不同,其使用sudo工具,可以灵活定义权限,输入的密码为当前普通用户密码,有系统记录,以便后期追责使用sudo,可以将root锁定:passwd-lroot,这样攻击者就不知道管理员......
  • HTTP中的Get和Post请求到底有什么区别?
    一、HTTP中的Get和Post请求到底有什么区别?1.HTTP诞生,是为了解决浏览器与服务器之间的通讯协议,GET用于读取资源,POST用于提交表单。2.后来被扩充到接口格式的定义,GET和Post作为接口的请求方式。二、协议核心四部分:Method:get/postUrl:UrlHeader:{}Body:{......
  • select*和select 常量 以及 select count(*) 和select count(1)的区别
    select 常量 from 表;与select* 表;select*from表;查询出表中所有数据,性能比较差;select常量from表,查询出结果是所有记录数的常量,性能比较高;selelct常量from...对应所有行,返回的永远只有一个值,即常量。例selecta,b,cfrom表名 select1from表名正常只会用来判断是......