首页 > 编程语言 >Java中Future 用来做异步任务返回

Java中Future 用来做异步任务返回

时间:2022-12-05 13:47:24浏览次数:46  
标签:异步 Java get Future CompletableFuture ANR 方法

我们在开发中会有这种场景,我们要调用远程服务的一个方法,并且拿到返回值去使用。笔者最近项目中出现了一个ANR,具体是调用了远程服务,发生异常一直没有返回值,然后导致ANR。

怎么解决呢?找了一圈,发现java中有个Future可以用来异步任务返回值。

具体场景是点击按钮调用getValue方法,在这个方法里面 通过 Executors.newFixedThreadPool(3)获取线程池,然后调用submit方法,在子线程中做耗时操作,在主线程通过Future 的get方法获取值。到这里笔者有个担忧。因为Future的get()方法是阻塞的,是否会导致主线程阻塞进而发生ANR的惨剧。

当笔者设置时间为4000时,多次快速点击没有出现ANR。

笔者手速噼里啪啦点击了不下三十下,么有崩溃,没有发生ANR。

Java1.0后官方出了个CompletableFuture,完美的解决了这个问题。
高级的使用CompletableFuture
前面提到的几种使用方法是使用异步编程最简单的步骤,CompletableFuture.get()的方法会阻塞直到任务完成,这其实还是同步的概念,这对于一个异步系统是不够的,因为真正的异步是需要支持回调函数,这样以来,我们就可以直接在某个任务干完之后,接着执行回调里面的函数,从而做到真正的异步概念。

在CompletableFuture里面,我们通过

thenApply()

thenAccept()

thenRun()

方法,来运行一个回调函数。

标签:异步,Java,get,Future,CompletableFuture,ANR,方法
From: https://www.cnblogs.com/changhongshi/p/16897363.html

相关文章

  • java复制对象到某一实体类
    ObjectMapperobjectMapper=newObjectMapper();Objectshot=JSONObject.parse(echelonSnapshot);StockEchelonProductAuthConfstockEchelonProductAuthConf=object......
  • (收藏)javascript变量提升
    函数和变量的声明总是会被解析器悄悄地被“提升”到方法体的最顶部上面是javascript变量提升的概念。为了更好地理解“变量提升”,我们先来看一段代码:(function(){cons......
  • 15篇关于java 8必读的教程
    ​​http://www.javacodegeeks.com/2014/04/15-must-read-java-8-tutorials.html​​......
  • Java基础-String、StringBuffer、StringBuilder类
    String类String的特性:String类代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。String是一个final类,代表不可变的字符序列。......
  • java 7中再谈try catch
    java7中的trycatch除了之前谈到的新特性外,本文简单来例子小结下,其实还是有不少地方要注意的,首先看一个典型的代码:先来两个异常类:1.publicc......
  • java中对象存在形式
    本文主要讲述jvm中对象的存储形式:classCat{Stringname;intage;Stringcolor;//行为}依据Cat类创建对象publicclassObject01......
  • JAVASCRIPT数组小结
    ​数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引。JavaScript数组是无类型的,数组元素可以是任意类型,并......
  • 笔记:正确得使用java 8得optional
    publicstaticStringgetName(Useru){if(u==null)return"Unknown";returnu.name;}比如以前这样得代码,经常要判断是否NULL,很麻烦,有了java8得option......
  • JDK的dt.jar和Java BeanInfo接口
    在JAVA_HOME/lib下面有两个比较重要的jar文件,tools.jar和dt.jar。 tools.jar在上篇文章中做了简单的介绍。这里来介绍下dt.jar。在Oracle官方网站搜dt.jar,找到JDKand......
  • (笔记)JMH基准测试,不错的JAVA基准测试工具
    测试JAVA中的方法的执行性能,比较稳妥合理的方法,是用JMH(​​https://openjdk.java.net/projects/code-tools/jmh/​​)这个JAVA的测试工具。1)MAVEN加入库: <properties>......