Guava併發:ListenableFuture使用介紹以及示例
ListenableFuture顧名思義就是可以監聽的Future,它是對java原生Future的擴充套件增強。我們知道Future表示一個非同步計算任務,當任務完成時可以得到計算結果。如果我們希望一旦計算完成就拿到結果展示給使用者或者做另外的計算,就必須使用另一個執行緒不斷的查詢計算狀態。這樣做,程式碼複雜,而且效率低下。使用ListenableFuture Guava幫我們檢測Future是否完成了,如果完成就自動呼叫回撥函式,這樣可以減少併發程式的複雜度。
ListenableFuture是一個介面,它從jdk的Future介面繼承,新增了void addListener(Runnable listener, Executor executor)
方法。
我們看下如何使用ListenableFuture。首先需要定義ListenableFuture的例項。
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); final ListenableFuturelistenableFuture = executorService.submit(new Callable () { @Override public Integer call() throws Exception { System.out.println("call execute.."); TimeUnit.SECONDS.sleep(1); return 7; } });
首先透過MoreExecutors類的靜態方法listeningDecorator方法初始化一個ListeningExecutorService的方法,然後使用此例項的submit方法即可初始化ListenableFuture物件。
我們上文中定義的ListenableFuture要做的工作,在Callable介面的實現類中定義,這裡只是休眠了1秒鐘然後返回一個數字7.
有了ListenableFuture例項,有兩種方法可以執行此Future並執行Future完成之後的回撥函式。
方法一:透過ListenableFuture的addListener方法
listenableFuture.addListener(new Runnable() { @Override public void run() { try { System.out.println("get listenable future's result " + listenableFuture.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }, executorService);
方法二:透過Futures的靜態方法addCallback給ListenableFuture新增回撥函式
Futures.addCallback(listenableFuture, new FutureCallback() { @Override public void onSuccess(Integer result) { System.out.println("get listenable future's result with callback " + result); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } });
推薦使用第二種方法,因為第二種方法可以直接得到Future的返回值,或者處理錯誤情況。本質上第二種方法是透過調動第一種方法實現的,做了進一步的封裝。
另外ListenableFuture還有其他幾種內建實現:
SettableFuture:不需要實現一個方法來計算返回值,而只需要返回一個固定值來做為返回值,可以透過程式設定此Future的返回值或者異常資訊
CheckedFuture: 這是一個繼承自ListenableFuture介面,他提供了checkedGet()方法,此方法在Future執行發生異常時,可以丟擲指定型別的異常。
原文連結:http://outofmemory.cn/java/guava/concurrent/ListenableFuture
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2805649/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Guava ListenableFuture介紹以及使用Guava
- Guava文件翻譯之ListenableFutureGuava
- Guava併發:使用Monitor控制併發Guava
- Guava庫介紹Guava
- Google guava工具類的介紹和使用GoGuava
- Guava RateLimiter限流器使用示例GuavaMIT
- MySQL多版本併發控制MVCC的實現示例程式碼介紹MySqlMVC
- Hbase JavaAPi介紹和使用示例(待更新)JavaAPI
- netcat 命令介紹及使用示例
- [譯] part 20: golang 併發介紹Golang
- spring boot 日誌介紹 以及 logback配置示例Spring Boot
- Java併發程式設計:Thread類的使用介紹Java程式設計thread
- MySQL 5.7 MyISAM併發插入特性介紹MySql
- ios中Runtime的介紹以及使用iOS
- log4j介紹以及使用教程
- go 併發程式設計案例二 常見併發模型介紹Go程式設計模型
- 工具篇:介紹幾個好用的guava工具類Guava
- useRoute 函式的詳細介紹與使用示例函式
- Java併發:ThreadLocal的簡單介紹Javathread
- Guava文件翻譯之 Guava簡介Guava
- 關於keras框架的介紹以及操作使用Keras框架
- 簡單介紹使用p-limit 限制併發數原始碼解析MIT原始碼
- guava的wiki和Strings的所有方法介紹Guava
- Cron表示式介紹與示例
- 高併發&效能優化(一)------總體介紹優化
- 高併發架構的TCP知識介紹架構TCP
- 高併發架構的CDN知識介紹架構
- Java併發(二十一)----wait notify介紹JavaAI
- Redis Stack功能介紹及redis-om-dotnet使用示例Redis
- Java併發 之 執行緒組 ThreadGroup 介紹Java執行緒thread
- go 併發程式設計案例一 課程介紹Go程式設計
- NodeJS介紹以及開發微信公眾號ExampleNodeJS
- 球幕影院的應用介紹以及使用特點
- 併發程式設計ConcurrentLinkedQueue使用示例詳解程式設計
- Go語言之併發示例(Runner)Go
- Docker(3):Dockerfile介紹及簡單示例Docker
- arguments的應用示例簡單介紹
- RabbitMQ簡介以及與SpringBoot整合示例MQSpring Boot