ListenableFuture 用法
时间: 2024-01-12 21:02:44 浏览: 24
ListenableFuture是Guava库中的一个接口,用于异步操作的实现。在Java中,Future接口常常用于异步操作的处理,但是Future的功能比较有限,不能对异步操作进行取消、超时等控制,也无法添加回调函数。而ListenableFuture则提供了更加丰富的功能,可以对异步操作进行更加灵活的处理。
下面是ListenableFuture的用法:
1. 创建ListenableFuture对象
可以通过Guava库中的Futures工具类创建ListenableFuture对象,也可以通过ListenableFutureTask创建。
```
ListenableFuture<String> future1 = Futures.immediateFuture("hello");
ListenableFuture<String> future2 = Futures.submit(() -> "world");
ListenableFutureTask<String> task = ListenableFutureTask.create(() -> "guava");
ListenableFuture<String> future3 = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor())
.submit(task);
```
2. 添加回调函数
可以通过addCallback方法添加回调函数,回调函数会在ListenableFuture执行完成后被调用。addCallback方法接收两个参数,一个是成功的回调函数,一个是失败的回调函数。
```
Futures.addCallback(future1, new FutureCallback<String>() {
@Override
public void onSuccess(String result) {
System.out.println(result);
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});
```
3. 超时控制
可以通过Futures工具类的withTimeout方法对ListenableFuture进行超时控制,如果超时则会抛出TimeoutException异常。
```
ListenableFuture<String> future = Futures.immediateFuture("hello");
try {
String result = Futures.withTimeout(future, 1, TimeUnit.SECONDS, true).get();
System.out.println(result);
} catch (TimeoutException e) {
e.printStackTrace();
}
```
4. 取消操作
可以通过ListenableFuture的cancel方法对异步操作进行取消,同时也可以设置是否中断正在执行的线程。
```
ListenableFuture<String> future = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor())
.submit(() -> {
Thread.sleep(5000);
return "hello";
});
future.cancel(true); // 取消操作并中断线程
```
以上就是ListenableFuture的基本用法,通过使用ListenableFuture可以更加灵活地处理异步操作。