Guava - 并行编程Futures详解

 更新时间:2016年09月15日 09:24:07   作者:破狼  
这篇文章主要介绍了Guava - 并行编程Futures详解方法的相关资料,需要的朋友可以参考下

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 的资料整理,后续继续补充相关资料谢谢大家对本站的支持!

相关文章

  • 浅谈JAVA在项目中如何自定义异常

    浅谈JAVA在项目中如何自定义异常

    今天给大家带来的是关于Java的相关知识,文章围绕着JAVA在项目中如何自定义异常展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot Security安装配置及Thymeleaf整合

    SpringBoot Security安装配置及Thymeleaf整合

    这篇文章主要介绍了SpringBoot Security安装配置及Thymeleaf整合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java 基于tcp协议实现文件上传

    Java 基于tcp协议实现文件上传

    这篇文章主要介绍了Java 基于tcp协议实现文件上传,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • Java 自定义Spring框架与核心功能详解

    Java 自定义Spring框架与核心功能详解

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发
    2021-10-10
  • 详解Java并发编程中的优先级队列PriorityBlockingQueue

    详解Java并发编程中的优先级队列PriorityBlockingQueue

    PriorityBlockingQueue是Java中实现了堆数据结构的线程安全的有界阻塞队列。本文将会深入解读PriorityBlockingQueue的源码实现,感兴趣的可以了解一下
    2023-05-05
  • Java基础学习之标签

    Java基础学习之标签

    在Java中,标签必须在循环之前使用, 一个循环之中嵌套另一个循环的开关,从多重嵌套中continue或break,该文详细介绍了标签的相关知识,对正在学习java基础的小伙伴们还很有帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot集成slf4j日志配置的方法

    SpringBoot集成slf4j日志配置的方法

    本文主要介绍了SpringBoot集成slf4j日志配置的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • jstl EL表达式遍历Map的方法

    jstl EL表达式遍历Map的方法

    这篇文章主要介绍了jstl EL表达式遍历Map的方法的相关资料,需要的朋友可以参考下
    2016-12-12
  • 详解Java如何实现基于Redis的分布式锁

    详解Java如何实现基于Redis的分布式锁

    在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。这篇文章运用图文和实例代码介绍了Java如何实现基于Redis的分布式锁,文章介绍的很详细,对Java和Redis刚兴趣的朋友们可以参考借鉴,下面来一起看看。
    2016-08-08
  • SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法

    SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法

    这篇文章主要介绍了SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论