Java异步编程工具Twitter Future详解

 更新时间:2022年05月23日 14:52:48   作者:凯哥的Java技术活  
这篇文章主要介绍了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异步编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis如何实现多表查询(多对一、一对多)

    MyBatis如何实现多表查询(多对一、一对多)

    这篇文章主要给大家介绍了关于MyBatis如何实现多表查询(多对一、一对多)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java(springboot) 读取txt文本内容代码实例

    Java(springboot) 读取txt文本内容代码实例

    这篇文章主要介绍了Java(springboot) 读取txt文本内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot事件发布和监听详解

    SpringBoot事件发布和监听详解

    今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节,所以下面这篇文章主要给大家介绍了关于SpringBoot事件发布和监听的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • Java那点事——StringBuffer与StringBuilder原理与区别

    Java那点事——StringBuffer与StringBuilder原理与区别

    本文给大家分享StringBuffer与StringBuilder的区别,它们的应用场景是什么?非常不错,面试考官经常考的一个问题,有需要的朋友跟着脚本之家小编一起学习吧
    2016-06-06
  • SpringAOP中的注解配置详解

    SpringAOP中的注解配置详解

    这篇文章主要介绍了SpringAOP中的注解配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 通Java接口上传实现SMMS图床

    通Java接口上传实现SMMS图床

    这篇文章主要介绍了通Java接口上传实现SMMS图床,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java使用MulticastSocket实现基于广播的多人聊天室

    java使用MulticastSocket实现基于广播的多人聊天室

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现基于广播的多人聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • java接口返回参数按照请求参数进行排序方式

    java接口返回参数按照请求参数进行排序方式

    这篇文章主要介绍了java接口返回参数按照请求参数进行排序方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java关键字finally_动力节点Java学院整理

    Java关键字finally_动力节点Java学院整理

    java关键字finally不管是否出现异常,finally子句总是在块完成之前执行。下面通过实现代码给大家介绍Java关键字finally相关知识,需要的的朋友参考下吧
    2017-04-04
  • Java中使用ConcurrentHashMap实现线程安全的Map

    Java中使用ConcurrentHashMap实现线程安全的Map

    在Java中,ConcurrentHashMap是一种线程安全的哈希表,可用于实现多线程环境下的Map操作。它支持高并发的读写操作,通过分段锁的方式实现线程安全,同时提供了一些高级功能,比如迭代器弱一致性和批量操作等。ConcurrentHashMap在高并发场景中具有重要的应用价值
    2023-04-04

最新评论