一、什麼是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-tw/n/335043.html