自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

概念

ListenableFuture顧名思義就是可以監(jiān)聽的Future,它是對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幫我們檢測Future是否完成了,如果完成就自動調(diào)用回調(diào)函數(shù),這樣可以減少并發(fā)程序的復(fù)雜度。

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

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

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

 

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

 

 

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個(gè)任務(wù)被提交  
  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)用結(jié)果  
  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

責(zé)任編輯:林師授 來源: oschina
相關(guān)推薦

2022-06-22 09:07:09

Guava算法

2024-12-02 08:02:36

2024-01-31 08:50:41

Guava并發(fā)工具

2021-05-21 12:36:16

限流代碼Java

2023-10-31 07:52:10

2024-10-18 16:58:26

2024-09-09 11:35:35

2021-06-09 11:41:10

RateLimiterJava代碼

2024-04-10 08:16:20

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

2024-05-24 14:35:49

2021-05-31 07:01:46

限流算法令牌

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配置

2021-06-07 17:51:29

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

2023-07-06 08:06:47

LockCondition公平鎖

2023-01-15 17:24:16

LinuxBSDwhereis?命令

2023-02-14 16:45:54

2023-01-10 14:10:27

Linuxwho 命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號