成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Guava并發(fā):ListenableFuture與RateLimiter示例

開發(fā) 后端
ListenableFuture顧名思義就是可以監(jiān)聽的Future,它是對java原生Future的擴展增強 RateLimiter類似于JDK的信號量Semphore,他用來限制對資源并發(fā)訪問的線程數(shù),本文介紹RateLimiter使用。

概念

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

推薦使用第二種方法,因為第二種方法可以直接得到Future的返回值,或者處理錯誤情況。本質(zhì)上第二種方法是通過調(diào)動***種方法實現(xiàn)的,做了進一步的封裝。

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

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

 

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

 

 

RateLimiter類似于JDK的信號量Semphore,他用來限制對資源并發(fā)訪問的線程數(shù),本文介紹RateLimiter使用。

代碼示例

  1. import java.util.concurrent.Callable;  
  2. import java.util.concurrent.ExecutionException;  
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.TimeUnit;  
  5.    
  6. import com.google.common.util.concurrent.FutureCallback;  
  7. import com.google.common.util.concurrent.Futures;  
  8. import com.google.common.util.concurrent.ListenableFuture;  
  9. import com.google.common.util.concurrent.ListeningExecutorService;  
  10. import com.google.common.util.concurrent.MoreExecutors;  
  11. import com.google.common.util.concurrent.RateLimiter;  
  12.    
  13. public class ListenableFutureDemo {  
  14.     public static void main(String[] args) {  
  15.         testRateLimiter();  
  16.         testListenableFuture();  
  17.     }  
  18.    
  19.     /**  
  20.      * RateLimiter類似于JDK的信號量Semphore,他用來限制對資源并發(fā)訪問的線程數(shù)  
  21.      */ 
  22.     public static void testRateLimiter() {  
  23.         ListeningExecutorService executorService = MoreExecutors  
  24.                 .listeningDecorator(Executors.newCachedThreadPool());  
  25.    
  26.         RateLimiter limiter = RateLimiter.create(5.0); // 每秒不超過4個任務被提交  
  27.    
  28.         for (int i = 0; i < 10; i++) {  
  29.             limiter.acquire(); // 請求RateLimiter, 超過permits會被阻塞  
  30.    
  31.             final ListenableFuture<Integer> listenableFuture = executorService  
  32.                     .submit(new Task("is "+ i));  
  33.         }  
  34.     }  
  35.    
  36.     public static void testListenableFuture() {  
  37.         ListeningExecutorService executorService = MoreExecutors  
  38.                 .listeningDecorator(Executors.newCachedThreadPool());  
  39.    
  40.         final ListenableFuture<Integer> listenableFuture = executorService  
  41.                 .submit(new Task("testListenableFuture"));  
  42.    
  43.            
  44.         //同步獲取調(diào)用結果  
  45.         try {  
  46.             System.out.println(listenableFuture.get());  
  47.         } catch (InterruptedException e1) {  
  48.             e1.printStackTrace();  
  49.         } catch (ExecutionException e1) {  
  50.             e1.printStackTrace();  
  51.         }  
  52.            
  53.         //***種方式  
  54.         listenableFuture.addListener(new Runnable() {  
  55.             @Override 
  56.             public void run() {  
  57.                 try {  
  58.                     System.out.println("get listenable future's result " 
  59.                             + listenableFuture.get());  
  60.                 } catch (InterruptedException e) {  
  61.                     e.printStackTrace();  
  62.                 } catch (ExecutionException e) {  
  63.                     e.printStackTrace();  
  64.                 }  
  65.             }  
  66.         }, executorService);  
  67.    
  68.         //第二種方式  
  69.         Futures.addCallback(listenableFuture, new FutureCallback<Integer>() {  
  70.             @Override 
  71.             public void onSuccess(Integer result) {  
  72.                 System.out  
  73.                         .println("get listenable future's result with callback " 
  74.                                 + result);  
  75.             }  
  76.    
  77.             @Override 
  78.             public void onFailure(Throwable t) {  
  79.                 t.printStackTrace();  
  80.             }  
  81.         });  
  82.     }  
  83. }  
  84.    
  85. class Task implements Callable<Integer> {  
  86.     String str;  
  87.     public Task(String str){  
  88.         this.str = str;  
  89.     }  
  90.     @Override 
  91.     public Integer call() throws Exception {  
  92.         System.out.println("call execute.." + str);  
  93.         TimeUnit.SECONDS.sleep(1);  
  94.         return 7;  
  95.     }  

Guava版本

  1. <dependency> 
  2.             <groupId>com.google.guava</groupId> 
  3.             <artifactId>guava</artifactId> 
  4.             <version>14.0.1</version> 
  5.         </dependency> 

本文出自:http://my.oschina.net/cloudcoder/blog/359598

責任編輯:林師授 來源: oschina
相關推薦

2022-06-22 09:07:09

Guava算法

2024-12-02 08:02:36

2021-05-21 12:36:16

限流代碼Java

2024-01-31 08:50:41

Guava并發(fā)工具

2023-10-31 07:52:10

2024-09-09 11:35:35

2024-10-18 16:58:26

2021-06-09 11:41:10

RateLimiterJava代碼

2024-04-10 08:16:20

多線程編程Java并發(fā)編程

2021-05-31 07:01:46

限流算法令牌

2024-05-24 14:35:49

2025-03-26 03:25:00

SpringGuavaCaffeine

2024-08-29 08:28:17

2009-07-03 17:44:06

JSP介紹

2009-07-09 16:22:12

WebWork配置

2023-07-06 08:06:47

LockCondition公平鎖

2021-06-07 17:51:29

并發(fā)高并發(fā)編程

2023-01-15 17:24:16

LinuxBSDwhereis?命令

2023-01-10 14:10:27

Linuxwho 命令

2023-02-14 16:45:54

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品日本 | 国产高清视频一区二区 | 日韩欧美国产精品一区二区三区 | 国产成人久久久 | 欧美乱大交xxxxx另类电影 | 成人日韩 | 久久久精品一区二区三区 | 网址黄| 久久久久国产一区二区三区 | 欧美片网站免费 | 日韩欧美国产不卡 | 亚洲视频二区 | 污书屋 | 一级欧美一级日韩片免费观看 | 久久毛片| 午夜影院在线观看视频 | 国产精品一区二区电影 | 国产二区视频 | 久久成人午夜 | 午夜精品久久久久久久99黑人 | 亚洲电影成人 | 日韩一区二区三区视频在线观看 | 欧美a在线 | 国产精品国产三级国产a | 亚洲欧美一区二区三区1000 | 一区二区三区欧美 | 亚洲精品久久久一区二区三区 | 久久的色 | 欧美aaa| 欧美一级视频在线观看 | 涩涩鲁亚洲精品一区二区 | 日韩成人在线视频 | 亚洲精品二区 | 欧美日韩国产精品一区二区 | 永久免费av| 久久久久国产精品一区二区 | 一级黄色片免费在线观看 | 亚洲成人免费在线观看 | 久久99国产精一区二区三区 | 黄色一级视频 | 欧美一区二区免费电影 |