一. ListenableFuture是用来增强Future的功能的。
我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,不断代码复杂,而且效率低下。
ListenableFuture,顾名思义,就是可以监听的Future。我们可以为ListenableFuture增加Listener监听器,当任务完成时,直接执行某个线程,或者我们可以直接为ListenableFuture设置回调函数,当任务完成时,自动执行该回调方法。
下面我们看看ListenableFuture的实际用法。
(1)怎样得到ListenableFuture对象?
我们知道ExecutorService.submit(Callable) 会返回Future对象,那么ListeningExecutorService.submit(Callable)会返回ListenableFuture对象。
ListeningExecutorService可以通过MoreExecutors.listeningDecorator(ExecutorService)来得到。
(2)增加Listenable功能
方法一:直接添加监听
ListenableFuture. addListener(Runnable listener, Executor executor)
可以为ListenableFuture增加一个监听,当线程计算完成时,自动执行一个Runnable线程。
方法二:添加回调方法
Futures.addCallback(ListenableFuture, new FutureCallback<T>() {
public void onSuccess(T t) {
}
public void onFailure(Throwable thrown) {
}
});
Futures的静态方法addCallback可以为ListenableFuture对象添加回调函数,回调里面可以定义计算成功时和失败时分别的操作。onSuccess里面可以把计算结果做为参数传入。onFailure里面可以把异常做为参数传入。
那我们一般应该怎么选择这两种方式呢?建议直接用第二种,因为这种方式可以把计算结果做为参数传入。其实,第二种的内部实现就是用的第一种方式,但是用起来会更加的简洁。
(3)ListenableFutureTask
我们知道,FutureTask实现了Future和Runnable接口。
FutureTask有2个构造方法:
FutureTask(Callable<V> callable)
创建一个 FutureTask,一旦运行就执行给定的 Callable。
FutureTask(Runnable runnable, V result)
创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果
Thread thread = new Thread(futureTask);
thread.start();
当futureTask被某个线程执行时,就会自动执行Callable或者Runnable,Callable的call方法返回计算结果,对应Runnable作为参数的版本,另一个参数V result将作为结果进行返回。
当计算完成时,futureTask.get()方法就会返回这个结果。
可以看到,这段代码很复杂,而且计算完成时缺乏回调机制。ListenableFutureTask正是为了解决这些问题。ListenableFutureTask同样有2个版本的方法。
ListenableFutureTask.create(Callable<V>)
ListenableFutureTask.create(Runnable, V)
很简单,这2个方法都返回ListenableFutureTask<V>对象,然后就可以用之前所说的方式直接添加回调函数或者回调接口。
(4)返回值固定,不需要计算时
有时候,我们的Future不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,那么可以直接使用 SettableFuture,或者跟 SettableFuture 一样,自己来继承AbstractFuture<V>。
SettableFuture提供了2个方法,分别用来设置成功时的返回值,或者失败时抛出的异常。
booleanset(V value)
booleansetException(Throwable throwable)
另外还有静态方法create()会构造一个初始状态的SettableFuture对象。
示例代码:
SettableFuture<Integer> future = SettableFuture.create();
future.set(100);//自己根据业务逻辑,来设置返回值
// or future.setException(new Throwable()); //或者计算失败,抛出异常
Futures.addCallback(future, new FutureCallback<Integer>() {
@Override
public void onSuccess(Integer result) {
}
@Override
public void onFailure(Throwable t) {
}
});
相关推荐
Guava是Google提供的一个强大的Java库,提供了许多实用功能,例如集合框架的扩展、缓存、并发工具等。在处理空集合时,Guava提供了更安全的API。比如,Guava的`Optional<T>`类可以用来表示一个值可能存在也可能不...
Guava学习笔记笔记的大部分中文翻译内容来源于以下译者: 沉义扬,罗立树,何一昕,武祖校对:方腾飞感谢给我们带来的这一系列好文章。引言Guava工程包含了若干被Google的Java项目广泛依赖的核心库,例如:集合...
Guava的学习笔记.docx文件可能包含了对以上概念的详细解释和示例代码,而未命名的压缩包子文件可能是实际的代码示例或者更深入的案例研究。通过阅读这些材料,你可以深入了解Guava库的用法,并将其应用于你的项目中...
总的来说,结合《Java并发编程实践学习笔记》和这些Guava相关的文档,开发者可以系统地学习Java并发编程,掌握如何在实际项目中运用并发技术,提高代码的并发性和效率,同时了解Google内部的并发缓存策略,提升大型...
Guava Joda-time Log4j Java 8 容器 Tomcat 1、Java 语言基础和JDK源码阅读 Java 语言基础 编号 名称 1 基本 2 运算符 3 数据类型 4 类 对象 接口 5 数组 6 枚举 7 异常处理 8 注解 9 范型 其他 编号 名称 1 Object...
6、**限流**:在高并发场景下,限流策略可以保护系统稳定,RuoYi可能利用如Guava RateLimiter或Spring Cloud Gateway等工具实现。 7、**幂等性处理**:防止表单重复提交是幂等性的一个应用场景,通过令牌机制或唯一...
这可以通过如Guava库的RateLimiter或Spring Cloud Gateway的限流插件实现。 2. **分布式锁**:在减库存操作时,使用分布式锁确保同一时刻只有一个请求能够执行,避免并发问题。可以使用Redis的setnx命令或者...
5. **并发编程**:并发工具类(如ConcurrentHashMap、Semaphore、CountDownLatch),以及并发容器(如ConcurrentLinkedQueue)的使用。 6. **分布式相关**:负载均衡、分布式缓存(如Redis)、分布式锁、消息队列...
例如,“对手分布函数库”可能指的是在Java中使用不同的库(如Apache Commons或Guava)来处理数据分布或算法;“空间不能快速的纪念版”可能是指内存管理或性能优化问题;“上课了半年”暗示了作者正在进行长期的...
此外,Guava库提供了更丰富的工具类,如Preconditions、Lists、Maps等,提高了开发效率。 以上五个部分构成了Java编程的基础,掌握这些知识点能够帮助开发者构建高效、稳定的系统。在实际工作中,结合具体需求,...
笔记 Java 语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 ...
[笔记] dagger2: Retrofit和ButterKnife的注解怎么实现 反射 JOOR [ClassLoader==>字节码,apk] Socket==>openfire==>netty 设计模式:都在源码里 更好的使用java: [Json] Gson: [xml==>webservice] [Rxjava] ...
6. **Guava Cache**:Google的Guava库提供了强大的缓存功能,可能会详细讲解如何使用Guava Cache构建和管理缓存。 7. **JCache(JSR 107)**:Java标准的缓存API,介绍如何利用JCache接口进行缓存操作,以及它与...
heavyz的Tomcat学习笔记(包括启动流程分析、启动脚本分析) ] () [ java8 新特性讲解系列文章 ] () [ Java 从Jar文件中动态加载类 ] () [ Java并发源码分析 - ThreadPoolExecutor ] () [ java ClassLoader 基本原理 ]...
它旨在帮助开发者通过Markdown格式整理和分享他们的学习笔记,同时也涵盖了其他技术领域如Vue.js、Node.js、Android学习以及Guava库的常用解析。 【描述】该项目可能是正在进行中的工作,因为提到了"可能未完结",...
Java语言的特点包括跨平台性(得益于"一次编写,到处运行"的JVM)、强大的库支持(如Apache Commons、Google Guava等)、以及丰富的生态系统(如Maven Central仓库)。在实际开发中,Java被广泛应用于Web应用、大...
在Java多线程的实践中,通过阅读和理解开源项目的源码,如Apache Commons Pool、Google Guava的线程池管理,可以帮助我们更好地理解和运用线程管理。同样,设计模式的源码实现,如Spring框架中的策略模式、工厂模式...
此外,Java还提供了线程同步机制,包括synchronized关键字、wait()和notify()方法以及Lock接口(如ReentrantLock),用于解决并发访问资源时可能出现的问题,如死锁、竞态条件和活锁等。理解线程生命周期、线程安全...
这个压缩包中可能包含了大量的教程、示例代码、笔记文档和其他相关材料,为初学者和经验丰富的开发者提供了丰富的学习资源。 1. **基础语法**:Java的基础语法是学习的起点,包括数据类型(如基本类型和引用类型)...