轉載:https://my.oschina.net/realfighter/blog/349929java
Guava提供了 FutureCallback接口,FutureCallback接口提供了onSuccess 和onFailure 方法,onSuccess 方法以Future任務的執行結果做爲參數,所以咱們就能夠在成功時候獲取任務執行的結果,作進一步的處理了。app
使用 FutureCallback很是簡單,咱們以相似的方式向ListenableFuture註冊一個回調接口,咱們不須要直接向 ListenableFuture添加FutureCallback回調函數,而是直接使用Futures.addCallback方法。Futures 類提供了一些有用的、用於處理Future實例的靜態方法集合,接下來咱們來看一個例子,首先來看一個簡單的FutureCallback接口的實現:ide
import java.util.concurrent.Callable;函數
import java.util.concurrent.ExecutorService;ui
import java.util.concurrent.Executors;google
import org.junit.Test;spa
import com.google.common.util.concurrent.FutureCallback;.net
import com.google.common.util.concurrent.Futures;線程
import com.google.common.util.concurrent.ListenableFuture;對象
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
public class FutureCallbackImpl implements FutureCallback<Person> {
private StringBuilder builder = new StringBuilder();
@Override
public void onSuccess(Person result) {
builder.append(result).append(" successfully");
}
@Override
public void onFailure(Throwable t) {
builder.append(t.toString());
}
public String getCallbackResult() {
return builder.toString();
}
@Test
public void testFutureCallback() {
// 建立一個線程緩衝池Service
ExecutorService executor = Executors.newCachedThreadPool();
// 建立一個ListeningExecutorService實例
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(executor);
// 提交一個可監聽的線程(能夠返回自定義對象,也可直接返回String)
ListenableFuture<Person> futureTask = executorService.submit(new Callable<Person>() {
Person p = new Person();
@Override
public Person call() throws Exception {
// return "Task completed";
p.setName("gogo");
return p;
}
});
FutureCallbackImpl callback = new FutureCallbackImpl();
// 線程結果處理回調函數
Futures.addCallback(futureTask, callback);
// 若是callback中執行的是比較費時的操做,Guava建議使用如下方法。
// Futures.addCallback(futureTask,callback,executorService);
// 處理後的線程執行結果:"Task completed successfully"
System.out.println(callback.getCallbackResult());
// assertThat(callback.getCallbackResult(), is("Task completed successfully"));
}
}
Futures.addCallback(futureTask,callback,executorService);
這個方法,FutureCallback操做將會執行在單獨的線程,這個線程由傳入的ExecutorService參數提供。不然的話,初始 ListenableFuture實例執行的線程將會執行FutureCallback操做,就像ThreadPoolExecutor、 CallerRunsPolicy執行者服務,即任務將在調用者的線程上運行。