番石榴的ListenableFuture

Guava中的ListenableFuture試圖為Future對象定義一致的API,以注冊完成回調。 通過在Future完成時添加回調的功能,我們可以異步有效地響應傳入的事件。 如果您的應用程序與許多將來的對象高度并發,我強烈建議您盡可能使用ListenableFuture 。 從技術上講, ListenableFuture通過添加以下簡單ListenableFuture擴展了Future接口:

void addListener(Runnable listener, Executor executor)

方法。 而已。 如果掌握了ListenableFuture ,則可以注冊Runnable以在有問題的將來完成時立即執行。 您還必須提供將用于執行您的偵聽ExecutorExecutorService擴展)–這樣長時間運行的偵聽器不會占用您的工作線程。

讓我們付諸行動。 我們將從重構我們的第一個Web ListenableFuture 器示例以使用ListenableFuture 。 幸運的是,在線程池的情況下,只需使用MoreExecutors.listeningDecorator()將它們包裝起來MoreExecutors.listeningDecorator()

ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));for (final URL siteUrl : topSites) {final ListenableFuture<String> future = pool.submit(new Callable<String>() {@Overridepublic String call() throws Exception {return IOUtils.toString(siteUrl, StandardCharsets.UTF_8);}});future.addListener(new Runnable() {@Overridepublic void run() {try {final String contents = future.get();//...process web site contents} catch (InterruptedException e) {log.error("Interrupted", e);} catch (ExecutionException e) {log.error("Exception in task", e.getCause());}}}, MoreExecutors.sameThreadExecutor());
}

有幾個有趣的發現。 首先,請注意ListeningExecutorService如何包裝現有的Executor 。 這類似于ExecutorCompletionService方法 。 稍后,我們注冊自定義Runnable ,以便在每個任務完成時得到通知。 其次,請注意錯誤處理變得多么丑陋:我們必須處理InterruptedException (從技術上講,這應該永遠不會發生,因為Future已經解決,并且get()永遠不會拋出它)和ExecutionException 。 我們還沒有介紹,但是Future<T>必須以某種方式處理異步計算期間發生的異常。 此類異常包含在從get()引發的ExecutionException (因此在記錄期間調用getCause() get()

最后請注意正在使用MoreExecutors.sameThreadExecutor() 。 這是一個方便的抽象,您可以使用每API一些想要使用的時間Executor / ExecutorService (大概線程池),而你的罰款使用當前線程。 這在單元測試期間特別有用–即使您的生產代碼使用異步任務,在測試期間您也可以從同一線程運行所有內容。

不管它多么方便,整個代碼看起來都有些混亂。 幸運的是,在夢幻般的Futures類中有一個簡單的實用程序方法:

Futures.addCallback(future, new FutureCallback<String>() {@Overridepublic void onSuccess(String contents) {//...process web site contents}@Overridepublic void onFailure(Throwable throwable) {log.error("Exception in task", throwable);}
});

FutureCallback是一個更簡單的抽象方法,可以解決將來的問題并為您執行異常處理。 如果需要,您仍然可以為偵聽器提供自定義線程池。 如果您仍然使用一些仍會返回Future舊式API,則可以嘗試JdkFutureAdapters.listenInPoolThread() ,它是將普通Future<V>轉換為ListenableFuture<V>的適配器。 但是請記住,一旦開始使用addListener() ,每個這樣的適配器將只需要一個線程即可工作,因此此解決方案根本無法擴展,因此應避免使用它。

Future<String> future = //...
ListenableFuture<String> listenableFuture =JdkFutureAdapters.listenInPoolThread(future);

一旦了解了基礎知識,我們就可以深入探究聽期貨的最大優勢: 轉型和連鎖 。 這是高級材料,已被警告。

參考: NoBlogDefFound博客中來自JCG合作伙伴 Tomasz Nurkiewicz的番石榴中的ListenableFuture 。

翻譯自: https://www.javacodegeeks.com/2013/02/listenablefuture-in-guava.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員的幸福感和頸椎病

脖子一直疼&#xff01; 去醫院檢查&#xff0c;拍片子的醫生在造影室里沖我喊&#xff1a; “小伙子&#xff0c;你多大年紀啦&#xff1f;” 我說&#xff1a;“我三十來歲&#xff0c;咋啦” 醫生說&#xff1a;“怎么這么年輕就得這種病啊&#xff01;” 我當時腿就有點軟&…

python實現詞語相似度計算分析_相似度計算的方法及Python實現

現實生活中&#xff0c;我們經常提到距離這個詞&#xff0c;本文談的相似度就是基于距離定義的&#xff0c;當兩個向量之間的距離特別小時&#xff0c;就說這倆個向量相似度高&#xff0c;反之相似度不高。所以&#xff0c;衡量相似度的指標就是距離度量。經常使用的相似度計算…

poll函數_I/O復用 - 三組I/O復用函數的比較

在之前的文章中 I/O復用 - epoll 和 I/O復用 - select&poll 中我們討論了三組I/O復用的系統調用&#xff0c;這3組系統調用都能同時監聽多個文件描述符。它們將等待由timeout參數指定的超時時間&#xff0c;直到一個或多個文件描述符上有事件發生時返回&#xff0c;返回值是…

HTML適應手機瀏覽器寬度

在網頁的<head>中增加以上這句話&#xff0c;可以讓網頁的寬度自動適應手機屏幕的寬度: <meta name"viewport" content"widthdevice-width, initial-scale1.0, minimum-scale0.5, maximum-scale2.0, user-scalableyes" /> <meta name&q…

css3畫圖那些事(三角形、圓形、梯形等)

閑來無事&#xff0c;寫寫圖形。當時鞏固一下css3吧.。前端小白&#xff0c;寫的不好還請前輩多指教。 三角形 { width: 0;height: 0;border-bottom: 140px solid red ;border-right: 70px solid transparent;border-left: 70px solid transparent; } 圓形 {width: 0px;height…

MyBatis教程– CRUD操作和映射關系–第1部分

CRUD操作 MyBatis是一個SQL Mapper工具&#xff0c;與直接使用JDBC相比&#xff0c;它極大地簡化了數據庫編程。 步驟1&#xff1a;創建一個Maven項目并配置MyBatis依賴項。 <project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema…

Java開發人員的升級之路

第一部分&#xff1a;對于參加工作一年以內的同學。恭喜你&#xff0c;這個時候&#xff0c;你已經擁有了一份Java的工作。這個階段是你成長極快的階段&#xff0c;而且你可能會經常加班。但是加班不代表你就可以松懈了&#xff0c;永遠記得我說的那句話&#xff0c;從你入行那…

docker 數據庫 mysql_在Docker中體驗數據庫之MySql

在上一篇在Docker中體驗數據庫之Mongodb之后&#xff0c;這次記錄一下在docker中安裝mysql。過程要比Mongodb麻煩一點……參考網址&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/linux-installation-docker.htmlhttps://hub.docker.com/r/mysql/mysql-server/安裝過程如…

STL概覽——棧( stack )、隊列( queue )和優先級隊列( priority_queue)

棧&#xff08;stack&#xff09; stack是一種先進后出&#xff08;First In Last Out&#xff0c;FILO&#xff09;的數據結構&#xff0c;它只有一個口&#xff0c;平常在我們寫深度優先遍歷算法時&#xff0c;&#xff0c;就會用到棧&#xff0c;stack允許我們增加&#xff…

使用JMeter對異步HTTP / REST服務進行壓力/負載測試

盡管我一直在使用JMeter進行Web應用程序的壓力測試和負載測試好幾次&#xff0c;但我們還是花了一些時間才弄清楚如何使用該工具測試基于異步HTTP / REST的服務。 在我們這里&#xff0c;我是指一名程序員&#xff0c; Holger Staudacher &#xff0c;我很榮幸能與當前的一個項…

轉義字符的使用和功能python_Python中轉義符和格式符的混合使用,python,轉義字符,與,格式化...

# coding: utf-8 mon 麻辣小龍蝦 #周一麻辣小龍蝦 tue 宮保雞丁 #周二宮保雞丁 wed 水煮肉片 #周三水煮肉片 thu 果兒拌菜 #周四果兒拌菜 fri 小雞燉蘑菇 #小雞燉蘑菇 Cf_price 23 #麻辣小龍蝦價格 CK_price 12 #宮保雞丁價格 BM_price 32 #水煮肉片價格 MV_price 19 …

mock接口開發,excel(讀,寫,修改)

mock接口開發 首先需要安裝 Flask 模塊 &#xff1a;pip install flask 然后引用 from flask import request #想獲取到請求參數的話&#xff0c;就得用這個 lanxia flask.Flask(__name__) #把這個python文件當做一個web服務 lanxia.server(/login,[ post , get ] )#第…

web前端學習之ruby標記和rt/rp標記

ruby 標記定義ruby注釋&#xff08;中文注音或字符&#xff09;。ruby標記與rt標記一同使用。ruby標記由一個或多個字符&#xff08;需要一個解釋/發音&#xff09;和一個提供該信息的rt 標記組成&#xff0c;還包括可選的rp標記&#xff0c;定義當瀏覽器不支持ruby 標記時顯示…

mysql 5.7 udf http_mysql下mysql-udf-http效率測試小記

看到張宴的博客上關于"http/rest客戶端的文章"&#xff0c;怎樣安裝啥的直接都跳過&#xff0c;下面直接進入測試階段&#xff0c;測試環境&#xff1a;虛擬機復制代碼 代碼如下:[rootlocalhost ~]# uname -aLinux sunss 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 …

作為一名程序員,聊聊我們的現狀和未來

前言&#xff1a;互聯網這個高速發展的新興行業&#xff0c;注定是敢想敢干敢創新&#xff0c;耐勞耐操耐折騰年輕人的天下&#xff1f; 我們所在的互聯網行業&#xff0c;不斷地有新的公司冒出&#xff0c;有新的商業模式成形&#xff0c;有新的產品形態影響著大家的生活日常&…

適用于孩子,父母和祖父母的JBoss HornetQ –第1章

現在與HornetQ合作已經快4年了&#xff0c;我認為是時候分享我到目前為止所學知識的一部分了。 這篇文章的主要目的不是重寫官方文檔 &#xff0c;而是以簡單的方式闡明我們在PaddyPower中最常用的概念。 什么是HornetQ HornetQ是JMS實現。 JMS是一種面向消息的中間件API&am…

riot.js教程【四】Mixins、HTML內嵌表達式

前文回顧riot.js教程【三】訪問DOM元素、使用jquery、mount輸入參數、riotjs標簽的生命周期&#xff1b;riot.js教程【二】組件撰寫準則、預處理器、標簽樣式和裝配方法&#xff1b;riot.js教程【一】簡介&#xff1b; 共享Mixins 混合開發可以使你很好的復用代碼&#xff0c;如…

移動端判斷手機橫豎屏狀態

禁用用戶自動縮放功能&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0"> 判斷橫豎屏狀態有兩種方法&#xff1a;css判斷、js判斷 (一)、css判斷橫屏還是豎屏 1、寫在同一個css文…

ubuntu dhcp ping 不通 自己_??2、DHCP安裝和配置

DHCP動態主機設置協議&#xff0c;是一個局域網的網絡協議&#xff0c;使用UDP協議工作&#xff0c;可以快速分配IP地址&#xff0c;解決內網IP不足、手動配置IP造成IP沖突以及內網機器多手工配置比較麻煩的問題。1.把win2008和win2003設置同一網段&#xff0c;網絡適配器—配置…

python秒數變日期_將pandas日期列轉換為已用秒數

新答案 將文本轉換為Timedeltadf[Origin Time(Local)] pd.to_timedelta(df[Origin Time(Local)]) df[Seconds] df[Origin Time(Local)].dt.total_seconds() 舊答案 考慮數據幀dfdf pd.DataFrame(dict(Datepd.date_range(2017-03-01, 2017-03-02, freq2H))) Date 0 2017-03-0…