Guava併發:ListenableFuture使用介紹以及示例

choubou發表於2021-09-09

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 ListenableFuture listenableFuture = 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還有其他幾種內建實現:

  1. SettableFuture:不需要實現一個方法來計算返回值,而只需要返回一個固定值來做為返回值,可以透過程式設定此Future的返回值或者異常資訊

  2. CheckedFuture: 這是一個繼承自ListenableFuture介面,他提供了checkedGet()方法,此方法在Future執行發生異常時,可以丟擲指定型別的異常。

原文連結:http://outofmemory.cn/java/guava/concurrent/ListenableFuture

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2805649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章