Guava - 并行编程Futures详解

作者:破狼 时间:2022-04-28 23:16:34 

Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展。

继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。

对ListenableFuture添加回调函数:

Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor)

其中 FutureCallback是一个包含onSuccess(V),onFailure(Throwable)的接口。

使用如:


Futures.addCallback(ListenableFuture, new FutureCallback<Object>() {

public void onSuccess(Object result) {
   System.out.printf("onSuccess with: %s%n", result);
 }

public void onFailure(Throwable thrown) {
   System.out.printf("onFailure %s%n", thrown.getMessage());
 }
});

同时Guava中Futures对于Future扩展还有:

  1. transform:对于ListenableFuture的返回值进行转换。

  2. allAsList:对多个ListenableFuture的合并,返回一个当所有Future成功时返回多个Future返回值组成的List对象。注:当其中一个Future失败或者取消的时候,将会进入失败或者取消。

  3. successfulAsList:和allAsList相似,唯一差别是对于失败或取消的Future返回值用null代替。不会进入失败或者取消流程。

  4. immediateFuture/immediateCancelledFuture: 立即返回一个待返回值的ListenableFuture。

  5. makeChecked: 将ListenableFuture 转换成CheckedFuture。CheckedFuture 是一个ListenableFuture ,其中包含了多个版本的get 方法,方法声明抛出检查异常.这样使得创建一个在执行逻辑中可以抛出异常的Future更加容易

  6. JdkFutureAdapters.listenInPoolThread(future): guava同时提供了将JDK Future转换为ListenableFuture的接口函数。

下边是一个对于Future的测试demo:


@Test
public void should_test_furture() throws Exception {
 ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

ListenableFuture future1 = service.submit(new Callable<Integer>() {
   public Integer call() throws InterruptedException {
     Thread.sleep(1000);
     System.out.println("call future 1.");
     return 1;
   }
 });

ListenableFuture future2 = service.submit(new Callable<Integer>() {
   public Integer call() throws InterruptedException {
     Thread.sleep(1000);
     System.out.println("call future 2.");
 //    throw new RuntimeException("----call future 2.");
     return 2;
   }
 });

final ListenableFuture allFutures = Futures.allAsList(future1, future2);

final ListenableFuture transform = Futures.transform(allFutures, new AsyncFunction<List<Integer>, Boolean>() {
   @Override
   public ListenableFuture apply(List<Integer> results) throws Exception {
     return Futures.immediateFuture(String.format("success future:%d", results.size()));
   }
 });

Futures.addCallback(transform, new FutureCallback<Object>() {

public void onSuccess(Object result) {
     System.out.println(result.getClass());
     System.out.printf("success with: %s%n", result);
   }

public void onFailure(Throwable thrown) {
     System.out.printf("onFailure%s%n", thrown.getMessage());
   }
 });

System.out.println(transform.get());
}

官方资料主页:https://awk.so/@code.google.com!/p/guava-libraries/wiki/ListenableFutureExplained

标签:Guava,并行编程,Futures
0
投稿

猜你喜欢

  • C#索引属性用法实例分析

    2023-02-02 14:15:19
  • 解决在for循环中remove list报错越界的问题

    2022-01-12 15:27:56
  • 基于java构造方法Vector修改元素源码分析

    2023-11-25 10:54:56
  • Java 中HttpURLConnection附件上传的实例详解

    2022-05-26 13:54:39
  • SpringBoot集成Spring Security用JWT令牌实现登录和鉴权的方法

    2023-07-02 22:48:29
  • 详解C语言内核字符串拷贝与比较

    2023-11-02 15:22:30
  • c#获取本机在局域网ip地址的二种方法

    2023-01-20 00:19:47
  • 自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    2023-04-04 05:26:04
  • MyBatis-Plus分页插件不生效的解决方法

    2023-03-10 20:24:58
  • C#中英文混合字符串截取函数

    2023-01-19 06:02:55
  • c#使用listbox的详细方法和常见问题解决

    2023-08-27 11:28:56
  • SpringBoot自定义加载yml实现方式,附源码解读

    2022-01-22 22:39:40
  • Android仿天猫横向滑动指示器功能的实现

    2022-10-09 16:53:58
  • java 算法之快速排序实现代码

    2023-01-30 01:44:59
  • SpringBean依赖和三级缓存的案例讲解

    2023-06-25 09:33:22
  • Java并发框架:Executor API详解

    2021-10-31 14:30:28
  • android如何获取view在布局中的高度与宽度详解

    2023-08-14 17:17:51
  • java8中:: 用法示例(JDK8双冒号用法)

    2023-11-25 06:21:21
  • 一文探寻Java装箱和拆箱的奥妙

    2022-08-15 21:41:21
  • Java中的线程同步与ThreadLocal无锁化线程封闭实现

    2023-09-17 04:48:06
  • asp之家 软件编程 m.aspxhome.com