前言

随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂。针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口。通常,我们处理方法是让代码同步顺序的去调取这些接口。显然,调取接口数量的增加必然会造成响应时间的增加,势必会对系统性能造成一定影响。

为了保证系统响应迅速,需要寻找一种方法能够使调取接口能够异步执行,而java正好提供了类似的方法,在java.util.concurrent中包含了Future相关的类,运用其中的一些类可以进行异步计算,以减少主线程的等待时间。比如启动一个main方法,main中又包含了若干个其它任务,在不使用java future的情况下,main方法中的任务会同步阻塞执行,一个执行完成后,才能去执行另一个;如果使用java future,则main方法中的任务会异步执行,main方法不用等待一个任务的执行完成,只需往下执行就行。一个任务的执行结果又该怎么获取呢?这里就需要用到Future接口中的isDone()方法来判断任务是否执行完,如果完成完成则可获取结果,如果没有完成则需要等待,可见虽然主线程中的多个任务是异步执行,但是无法确定任务什么时候执行完成,只能通过不断去监听以获取结果,所以这里是阻塞的。这样,可能某一个任务执行时间很长会拖累整个主任务的执行。

针对这样的情况,google对java.util.concurrent中的许多类进行封装,最终产生了google guava框架,其中com.google.common.util中的ListenableFuture就是本文要叙述的重点。查看com.google.common.util,发现其中的很多类都是对java.util.concurrent的封装,以增加特有的方法。ListenableFuture扩展了future方法,增加了addListener方法,该方法可以监听线程,并通过回调函数来获取结果,达到线程之间异步非阻塞执行。(future.get()异步阻塞?)

首先,了解下同步、异步、阻塞、非阻塞相关概念;其次,简单介绍java future和guava future相关技术,并通过示例代码进一步对其进行理解;最后,对java future和guava future进行比较。


同步、异步、阻塞、非阻塞

同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

https://blog.csdn.net/pistolove/article/details/51232004

最新文章

  1. FPGA与simulink联合实时环路系列——实验三 按键key
  2. iOS.ReactNative-5-make-react-native-to-support-dynamically-update
  3. 决策树Decision Tree 及实现
  4. SharePoint 2013 单一页面赋设计权限
  5. angularjs的页面拆分思想
  6. 一些正则在js使用方法
  7. maven项目中找不到Maven Dependencies解决办法
  8. pod setup 报CocoaPods was not able to update the `master` repo 错误解决办法
  9. ARP攻击之Kali Linux局域网断网攻击
  10. QT中使用google breakpad捕获程序崩溃异常
  11. centos7 lamp
  12. laravel 守护进程Supervisor的配置
  13. WOW.js和animate.css让页面滚动时显示动画
  14. yii框架通过IP地址来使用gii
  15. freespace_evidence
  16. php优秀框架codeigniter学习系列——前言
  17. iOS 11开发教程(十七)iOS11应用视图之使用按钮接收用户输入
  18. Android app 全局异常统一处理
  19. 提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释
  20. Spring学习之AOP详解

热门文章

  1. FreeMarker example all in one
  2. Install alipay支付宝安全控件 on firefox in linux
  3. vue$ref
  4. [转帖] kubeadm搭建kubernetes集群
  5. linux_查看磁盘与目录容量
  6. hive分区表
  7. scipy积分 integral
  8. mysql登录密码相关
  9. Linux(Debian) 上安装tomcat并注册服务开机自启动
  10. 捕捉JDialog的关闭事件