了解ListenableFuture

一、什麼是ListenableFuture

在並發編程中,Future是常用的技術,它可以異步執行一個操作,並且獲取其結果。但是一旦get()方法調用,當前線程就會同步阻塞等待結果返回,這會讓整個程序性能大打折扣。因此,Google Guava為了解決這個問題,提出了ListenableFuture,它可以異步執行操作,並且可以註冊回調函數,在操作結果返回後自動調用回調函數,不會阻塞當前線程。

一個ListenableFuture對象可以包裝一個異步計算任務,封裝業務邏輯,當計算完成時,可以通過添加回調的方式異步處理計算結果。

二、ListenableFuture的基本使用

Guava中的ListenableFuture接口和Java中的Future接口類似,區別在於ListenableFuture支持回調函數,所以我們必須添加回調函數回調在結果準備就緒時使用。

ListenableFuture listenableFuture = executorService.submit(() -> 1 + 2);
Futures.addCallback(listenableFuture, new FutureCallback() {
    public void onSuccess(Integer result) {
        System.out.println("計算結果:" + result);
    }

    public void onFailure(Throwable t) {
        System.out.println("計算失敗,異常信息:" + t.getMessage());
    }
}, executorService);

上面的代碼中,我們使用ExecutorService來創建一個ListenableFuture對象,接着添加回調函數。回調函數FutureCallback接口提供了兩個方法,onSuccess方法在結果準備就緒時被調用,onFailure在計算過程中拋出異常時被調用。

三、ListenableFuture的進階使用

1、使用Transform函數

Guava中提供了對Future結果進行轉換的接口:ListenableFuture.transform()

ListenableFuture listenableFuture = executorService.submit(() -> "hello world");
ListenableFuture listenableFuture1 = Futures.transform(listenableFuture, (Function) String::length, executorService);
Futures.addCallback(listenableFuture1, new FutureCallback() {
    public void onSuccess(Integer result) {
        System.out.println("計算結果:" + result);
    }

    public void onFailure(Throwable t) {
        System.out.println("計算失敗,異常信息:" + t.getMessage());
    }
}, executorService);

上面的代碼中,我們通過transform()方法對異步計算結果進行轉換,將String類型轉換為Integer類型。我們在addCallback()方法中添加回調函數,在轉換後的結果準備就緒時調用回調函數。

2、使用FutureCallback函數

除了基本使用和Transform函數轉換,ListenableFuture還支持FutureCallback接口的回調方法,FutureCallback同時支持onSuccess和onFailure方法。

ListenableFuture listenableFuture = service.submit(() -> {
    try {
        Thread.sleep(3000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "hello world";
});
Futures.addCallback(listenableFuture, new FutureCallback() {
    public void onSuccess(String result) {
        System.out.println("計算結果:" + result);
    }

    public void onFailure(Throwable t) {
        System.out.println("計算失敗,異常信息:" + t.getMessage());
    }
});

上面的代碼中,我們通過在回調函數內添加Thread.sleep()方法來模擬長時間的異步計算。在添加回調函數之後,程序會去執行其他操作,當計算完成後,onSuccess方法會被執行,否則onFailure方法會被執行。

四、ListenableFuture的應用場景

在實際的開發中,ListenableFuture廣泛應用於並發操作,異步操作等待結果後的處理。以下是ListenableFuture適用的一些場景:

1、延遲任務

適用於需要異步執行任務的場景,可以在異步執行後的回調函數中進行結果處理。

2、異步計算

適用於多線程計算複雜數據,計算完後返回數據的情況。

3、處理故障和錯誤

在處理異常錯誤信息時,通過回調函數將異常信息記錄,方便後續分析問題,並進行解決。

總結

本文詳細介紹了Guava中的ListenableFuture的使用方法,從基本使用到進階使用,再到ListenableFuture的應用場景等進行詳細的闡述。ListenableFuture的使用可以提高程序的性能,避免在調用get()方法時造成線程阻塞,同時可以異步處理計算結果,提高計算效率,縮短程序的運行時間。因此,在多線程並發操作的場景中,使用ListenableFuture將會是一個很好的選擇。

原創文章,作者:BTHWV,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/335043.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BTHWV的頭像BTHWV
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

發表回復

登錄後才能評論