溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Guava中ListenableFuture與RateLimiter如何使用

發(fā)布時(shí)間:2021-07-22 15:06:43 來(lái)源:億速云 閱讀:319 作者:Leah 欄目:編程語(yǔ)言

Guava中ListenableFuture與RateLimiter如何使用,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

概念

ListenableFuture顧名思義就是可以監(jiān)聽(tīng)的Future,它是對(duì)java原生Future的擴(kuò)展增強(qiáng)。我們知道Future表示一個(gè)異步計(jì)算任務(wù),當(dāng)任務(wù)完成時(shí)可以得到計(jì)算結(jié)果。如果我們希望一旦計(jì)算完成就拿到結(jié)果展示給用戶或者做另外的計(jì)算,就必須使用另一個(gè)線程不斷的查詢計(jì)算狀態(tài)。這樣做,代碼復(fù)雜,而且效率低下。使用ListenableFuture Guava幫我們檢測(cè)Future是否完成了,如果完成就自動(dòng)調(diào)用回調(diào)函數(shù),這樣可以減少并發(fā)程序的復(fù)雜度。

推薦使用第二種方法,因?yàn)榈诙N方法可以直接得到Future的返回值,或者處理錯(cuò)誤情況。本質(zhì)上第二種方法是通過(guò)調(diào)動(dòng)***種方法實(shí)現(xiàn)的,做了進(jìn)一步的封裝。

另外ListenableFuture還有其他幾種內(nèi)置實(shí)現(xiàn):

1.SettableFuture:不需要實(shí)現(xiàn)一個(gè)方法來(lái)計(jì)算返回值,而只需要返回一個(gè)固定值來(lái)做為返回值,可以通過(guò)程序設(shè)置此Future的返回值或者異常信息。

2.CheckedFuture: 這是一個(gè)繼承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future執(zhí)行發(fā)生異常時(shí),可以拋出指定類型的異常。

RateLimiter類似于JDK的信號(hào)量Semphore,他用來(lái)限制對(duì)資源并發(fā)訪問(wèn)的線程數(shù),本文介紹RateLimiter使用。

代碼示例

import java.util.concurrent.Callable;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.Executors;  import java.util.concurrent.TimeUnit;     import com.google.common.util.concurrent.FutureCallback;  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;  import com.google.common.util.concurrent.RateLimiter;     public class ListenableFutureDemo {      public static void main(String[] args) {          testRateLimiter();          testListenableFuture();      }         /**       * RateLimiter類似于JDK的信號(hào)量Semphore,他用來(lái)限制對(duì)資源并發(fā)訪問(wèn)的線程數(shù)       */     public static void testRateLimiter() {          ListeningExecutorService executorService = MoreExecutors                  .listeningDecorator(Executors.newCachedThreadPool());             RateLimiter limiter = RateLimiter.create(5.0); // 每秒不超過(guò)4個(gè)任務(wù)被提交             for (int i = 0; i < 10; i++) {              limiter.acquire(); // 請(qǐng)求RateLimiter, 超過(guò)permits會(huì)被阻塞                 final ListenableFuture<Integer> listenableFuture = executorService                      .submit(new Task("is "+ i));          }      }         public static void testListenableFuture() {          ListeningExecutorService executorService = MoreExecutors                  .listeningDecorator(Executors.newCachedThreadPool());             final ListenableFuture<Integer> listenableFuture = executorService                  .submit(new Task("testListenableFuture"));                        //同步獲取調(diào)用結(jié)果          try {              System.out.println(listenableFuture.get());          } catch (InterruptedException e1) {              e1.printStackTrace();          } catch (ExecutionException e1) {              e1.printStackTrace();          }                     //***種方式          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, new FutureCallback<Integer>() {              @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();              }          });      }  }     class Task implements Callable<Integer> {      String str;      public Task(String str){          this.str = str;      }      @Override     public Integer call() throws Exception {          System.out.println("call execute.." + str);          TimeUnit.SECONDS.sleep(1);          return 7;      }  }

Guava版本

<dependency>             <groupId>com.google.guava</groupId>             <artifactId>guava</artifactId>             <version>14.0.1</version>         </dependency>

關(guān)于Guava中ListenableFuture與RateLimiter如何使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI