在JDK5中增加了Future异步获取结果的功能,但是这种方式在获取的时候是阻塞的,在正常场景下这种实现方式肯定是不太友好的,当然可以通过轮询的方式去获取异步结果,但是这种方式比较消耗CPU并且获取结果也不会太及时,所以也不提倡使用;在jdk7中提供了CompletionService的take和pool方法,来获取执行的结果;jdk8中的CompletableFuture也是非常强大的实现了异步回调的功能;另外很多开源框架自己也实现了异步回调功能,像Netty的channelFuture,通过addListener来实现异步回调的编程方式;Guava也是同样的通过ListenableFuture实现了异步回调的编程方式。

下面主要介绍下jdk8中的CompletableFuture的使用方式以及Guava的使用方式:

一、jdk8中的CompletableFuture实现异步回调方式,话不多说,直接上代码:

/*** JDK CompletableFuture异步回调测试* */
public class JdkCompletableFutureTest {public static void main(String[] args) throws Exception {ExecutorService executor = ExecutorServiceSupport.newTheadPool("guava_future_test");testThenApply(executor);testThenAccept(executor);testExceptionally(executor);testWhenComplete2HaveValue(executor);testWhenComplete2Exception(executor);}/*** 对结果进行转换* @param executor*/public static void testThenApply (ExecutorService executor) {String result = CompletableFuture.supplyAsync(() -> "hello", executor).thenApply(s -> s + " world1").join();System.out.println(result);}/*** 结果打印输出* @param executor*/public static void testThenAccept (ExecutorService executor) {CompletableFuture.supplyAsync(() -> "hello", executor).thenAccept(s -> System.out.println(s + " world2"));}/*** 当运行时出现异常,可以通过此方式进行补偿* @param executor*/public static void testExceptionally (ExecutorService executor) {String result = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}if (1 == 1) {throw new RuntimeException("测试异常");}return "go";}, executor).exceptionally(e -> {System.out.println(e);return "hello world3";}).join();System.out.println(result);}/*** 记录每次运行完成的结果* 这里的完成有两种情况,一种是正常执行,有返回值;另外一种是抛出异常* 此处是抛出异常的情况* * @param executor*/public static void testWhenComplete2HaveValue (ExecutorService executor) {String result = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}return "go";}, executor).whenCompleteAsync((r, t) -> {System.out.println(r);System.out.println(t.getMessage());}, executor).exceptionally(e -> {System.out.println(e);return "hello world4";}).join();System.out.println(result);}/*** 记录每次运行完成的结果* 这里的完成有两种情况,一种是正常执行,有返回值;另外一种是抛出异常* 此处是抛出异常的情况* * @param executor*/public static void testWhenComplete2Exception (ExecutorService executor) {String result = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}if (1 == 1) {throw new RuntimeException("测试异常");}return "go";}, executor).whenCompleteAsync((r, t) -> {System.out.println(r);System.out.println(t.getMessage());}, executor).exceptionally(e -> {System.out.println(e);return "hello world5";}).join();System.out.println(result);}}

二、Guava也是同样的通过ListenableFuture实现异步回调,同样也是话不多说,直接上代码:

/*** GUAVA FUTURE异步回调测试* */
public class GuavaFutureTest {public static void main(String[] args) throws Exception {ExecutorService executor = ExecutorServiceSupport.newTheadPool("guava_future_test");ListeningExecutorService listenExecutor = MoreExecutors.listeningDecorator(executor);// 开始使用guava的异步回调ListenableFuture<String> listenFuture = listenExecutor.submit(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(5000);return "hello";}});// 获取回调结果Futures.addCallback(listenFuture, new FutureCallback<String>() {@Overridepublic void onSuccess(String result) {System.out.println(result);}@Overridepublic void onFailure(Throwable t) {}}, listenExecutor);Thread.sleep(10000);}}

使用Future实现异步回调的方式相关推荐

  1. twisted应用中异步回调的方式及线程的应用

    前言: 学习了golang的goruntine后,再回过头来看twisted网络编程库中的异步应用,没事琢磨下,以前搞过一个twisted做负载分发,性能差的要命,这几天再搞搞,看看能不能做少许提升. ...

  2. c# 异步回调post请求http

    之前提到想用HttpClient发送post请求向服务器请求数据,今天被师父发现使用了c#提供的异步接口,但是使用方式却依然是同步的,就是取了Result,结果依然会阻塞主线程,所以查了查,改成异步回 ...

  3. 【JUC系列】Future异步回调模式

    何为异步回调 前面只是一个例子,对并发的主要模式进行形象的说明. 下面正式来讲下经常使用的几个和并发相关的概念. 1.2.1. 同步.异步.阻塞.非阻塞 一:同步 所谓同步,就是在发出一个功能调用时, ...

  4. Future异步回调详解

    文章目录 案例 join实现 FutureTask Guava 的异步回调 扩展 关于我 案例 在深入理解 异步回调模式前,我们以一个经典案例来说明,即 数学家华罗庚先生的文章<统筹方法> ...

  5. dva中dispatch函数实现异步回调函数的方式

    #关于 dva中dispatch函数实现异步回调函数的方式 1.通过promise函数实现 这里先给出index.js 和modal模块的实现 services模块不需要做处理 //index.jsi ...

  6. 异步实现方式一:异步回调

    异步回调的实现依赖于多线程或者多进程 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单 ...

  7. c++ 异步回调_知道Java中的回调机制吗?

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  8. 并发编程之进程池,线程池 和 异步回调,协程

    1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...

  9. java异步回调历程

    java I/O的经历了BIO(Blocking IO),NIO(Non-blocking IO),AIO(Async-I/O),这些IO技术的发展都是依托已java版本的更新. 本文主要研究一下ja ...

最新文章

  1. Keras【Deep Learning With Python】—Keras基础
  2. UWP 图片剪切旋转工具
  3. Spark On K8S(Standalone模式部署)
  4. servlet的体系结构
  5. mysql怎么对比表结构_mysql查看表结构2种方式对比
  6. js+获取当前域名及跳转、下载操作
  7. HDC.Cloud | 解秘一杯茶的物联之旅
  8. ppk on javascript 笔记(六)--BOM
  9. 6种创新难以打动人心
  10. unity3d改变物体的中心位置_Unity3d粒子特效:制作火焰效果
  11. 有关微博营销的社交营销打法
  12. word无法在公式编辑器中输入字符
  13. 使用开源项目DCRM搭建Cydia源服务器
  14. “科林明伦杯”哈尔滨理工大学暑假训练赛 B吃雪糕 (异或思维题)(补题)
  15. 8.String str=“i“与 String str=new String(“i”)一样吗?
  16. 基于Win10的Peach下载安装以及Modbus模糊测试
  17. FBOX HMI脚本编写注意事项
  18. 名编辑电子杂志大师教程 | 如何打开名编辑电子杂志大师帮助文档?
  19. macOS 安装 wine
  20. 【数据分析案例】英雄联盟美服10000条排位数据分析

热门文章

  1. Leetcode279完全平方数(工商银行面试题):广度优先搜索.md
  2. caoz:数据分析这点事
  3. 全局描述表GDT、任务状态段TSS、局部描述表LDT之间的关系
  4. Python3 网络爬虫(一) 斗图网
  5. Mux-vlan (产生背景、mux-vlan的特点、mux-vlan基本配置)
  6. 计算机科学家霍金的预言,霍金的预言可能是真的!科学家刚探测到史上最强“外星人信号”...
  7. android 4.2.2提示 unauthorized终极解决办法,很粗暴
  8. FW: 男人必看必看的十部经典电影_拔剑-浆糊的传说_新浪博客
  9. SIGIR2023推荐系统论文集锦
  10. linux socket eof,Linux 中的 EOF 到底是什么?