我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java异步编程工具Twitter Future详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java异步编程工具Twitter Future详解

异步编程(Twitter Future)

为啥要异步

异步编程有点难以理解,这东西感觉不符合常理,因为我们思考都是按照串行的逻辑,事都是一件一件办。但在异步计算的情况下,回调往往分散在代码片段中,需要理解其中的意义。

最难搞的就是组合,嵌套。如果再加上递归,派发等逻辑,能写的极其复杂,又难以理解。当我们需要处理其中一个步骤中可能发生的错误时,情况会变得更糟。

java在核心库中引入了CompletableFuture,同时也是一个异步框架,有大约50种不同的方法用于组合、组合和执行异步计算步骤以及处理错误。

基本用法

1、封装计算逻辑,异步返回。

CompletableFuture的静态方法runAsyncsupplySync允许我们相应地使用Runnable和SupplySync函数类型创建一个完整的future实例。如下就是一个简单的示例。

CompletableFuture<String> future  =  
      CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(3 * 1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
      return "Hello";
});        
System.out.println("Main goes on...");        
String result = future.get();
System.out.println(result);

如上代码片段,打印后的结果是Main goes on 先执行,异步任务在future.get() 阻塞结果返回。

2、异步计算结果串联异步处理

如果想在一个future完毕后,接上另一个异步任务,则用法如下:

CompletableFuture<String> completableFuture
                = CompletableFuture.supplyAsync(() -> {
	try {
         System.out.println("task1: " + Thread.currentThread().getName());
         Thread.sleep(2 * 1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return "Hello";
    });

CompletableFuture<String> future 
	= completableFuture.thenApply(s -> {
    try {
    	System.out.println("task2: " + Thread.currentThread().getName());
    	Thread.sleep(1000);
    } catch (InterruptedException e) {
    	throw new RuntimeException(e);
    }
    return s + " World";
   });
   
System.out.println(future.get());

3、并行多个异步任务,统一等待结果

当我们需要并行执行多个Future时,我们通常希望等待所有Futrue都能够执行,然后处理它们的全部统一的返回结果。

CompletableFuture 的 allOf 静态方法允许等待所有的future完成:

如下面的代码片段:

CompletableFuture<String> future1
	= CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2
	= CompletableFuture.supplyAsync(() -> "my");
CompletableFuture<String> future3         
	= CompletableFuture.supplyAsync(() -> "World");

CompletableFuture<Void> combinedFuture
                = CompletableFuture.allOf(future1, future2, future3);
combinedFuture.get();
System.out.println(future1.isDone());
System.out.println(future2.isDone());
System.out.println(future3.isDone());

4、异步错误处理

CompletableFuture类不需要捕获语法块中的异常,而是允许我们用一种特殊的回调方法来处理。此方法接收两个参数:计算结果(如果成功完成)和异常结果(如果某些计算步骤有异常)。

String name = "fengkai
CompletableFuture<String> completableFuture
   =  CompletableFuture.supplyAsync(() -> {
   if ("fengkai".equals(name)) {
   	throw new RuntimeException("Computation error!"); 
   }
   return "Hello, " + name;
}).handle((s, t) -> s != null ? s : "Hello, Stranger!");

System.out.println(completableFuture.get());

Twitter包装

对于以上的代码,twitter工具包有自己的小包装,可以提升一点编程的逼格。

以下是用法:

pom依赖

首先引入maven坐标,因为是用scala编写的工具包,所以要引入scala的依赖。

<dependency>
	<groupId>org.scala-lang</groupId>
	<artifactId>scala-library</artifactId>
     <version>${scala.version}</version>
</dependency>
<dependency>
	<groupId>com.twitter</groupId>
	<artifactId>util-core_2.12</artifactId>
	<version>${twitter.util.version}</version>
</dependency>

1、封装计算逻辑,异步返回

注意这里的FuturePool,可以用ExecutorService去包装。

Future<String> future = futurePool.apply(() -> {
  try {
		Thread.sleep(3 * 1000);
	} catch (InterruptedException e) {
	    throw new RuntimeException(e);
	}
	return "Hello";
})

2、异步计算结果串联异步处理

CompletableFuture相似的,有以下用法,不过是用的map方法

Future<String> future = futurePool.apply(() -> {
	try {
	  System.out.println("task2: " + Thread.currentThread().getName());
	  Thread.sleep(1000);
	} catch (InterruptedException e) {
	  throw new RuntimeException(e);
	}
	return "Hello";
});
Future<Object> mappedFuture = future.map(new Function1<String, Object>() {
	@Override
	public Object apply(String v1) {
	  try {
	    System.out.println("task2: " + Thread.currentThread().getName());
	    Thread.sleep(1000);
	  } catch (InterruptedException e) {
	    throw new RuntimeException(e);
	  }
	  return "World";
	}
});

Await.result(mappedFuture);

3、并行多个异步任务

这个相对看起来就简洁的多了,用List添加所有的异步结果,然后collect收集起来,调用get()或者其他方法阻塞等待。

List<Future> futures = new ArrayList<>();
Future<String> future1 = futurePool.apply(() -> "hello");
Future<String> future2 = futurePool.apply(() -> "my");
Future<String> future3 = futurePool.apply(() -> "world");
futures.add(future1);
futures.add(future2);
futures.add(future3);
Future<List<String>> collect = Futures.collect(futureList);

4、错误处理

这部分处理也比较简洁,注意这里返回的是BoxedUnit.UNIT,其实这是scala的语法,可以理解成voidreturn

future.onFailure(new Function1<Throwable, BoxedUnit>() {
      @Override
      public BoxedUnit apply(Throwable v1)
      {
        System.out.println("Error");
        return BoxedUnit.UNIT;
      }
);

其他用法

除了以上的用法。其实还有很多用法。

例如:collectToTry,会返回一个Try对象,Try代表了一个成功返回的结果,或者错误返回的异常.

可以使用try.isReturn()​来判断是否是正常返回的。这在多个Future异步结果的处理中用着很​不错。

Future<List<Try<String>>> futures = Futures.collectToTry(futureList);

flattern(),该方法类似scala的扁平方法,可以将嵌套的异步对象拍平。

flatMap(),和flatMap的用法一致,不过是异步的结果。

当你用不好twitter future的时候,随时随地可以转成javaFuture。 toJavaFuture()。所以,放心用。

其他更有趣的方法,可以自己研究下,还是有点骚东西的。

其他工具

twitter的这个工具包出了异步编程外,还有其他的很实用的工具。 包括:

  • codec编解码
  • cahce缓存
  • hasing哈希相关
  • jackson
  • mock
  • thirft
  • validator

自行发掘吧。 地址是: github.com/twitter/uti…

到此这篇关于Java异步编程工具Twitter Future详解的文章就介绍到这了,更多相关Java异步编程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java异步编程工具Twitter Future详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

并发编程 | 从Future到CompletableFuture - 简化 Java 中的异步编程

引言 在并发编程中,我们经常需要处理多线程的任务,这些任务往往具有依赖性,异步性,且需要在所有任务完成后获取结果。Java 8 引入了 CompletableFuture 类,它带来了一种新的编程模式,让我们能够以函数式编程的方式处理并发任
2023-08-19

C++ 之std::future:理解并掌握异步编程的利器

在C++的世界里,std::future是一种非常重要的工具,它让我们能够以异步的方式执行代码,并在需要的时候获取结果。
C++编程2024-11-30

Java异步编程之Callbacks与Futures模型详解

这篇文章主要为大家详细介绍了Java异步编程中Callbacks与Futures模型的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-24

异步编程利器:CompletableFuture详解

最近刚好使用CompeletableFuture优化了项目中的代码,所以跟大家一起学习CompletableFuture。

rust异步编程详细讲解

这篇文章主要介绍了rust异步编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-12-16

C#异步编程之async/await详解

异步这个概念在不同语境下有不同的解释,不同的编程语言有不同异步编程方法,在C#语言中,常常使用async/await等关键字,和Task等类来实现异步编程。本文就来和大家聊聊async与await吧
2023-03-11

Java 8 异步编程 CompletableFuture 全解析

Future 是 Java 5 添加的类,用来描述一个异步计算的结果。你可以使用 isDone() 方法检查计算是否完成,或者使用 get() 方法阻塞住调用线程,直到计算完成返回结果,也可以使用 cancel() 方法停止任务的执行。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录