亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

簡析Java中的util.concurrent.Future接口

2019-11-26 15:06:12
字體:
來源:轉載
供稿:網友

在一個單線程應用中,當你調用一個方法只有計算結束才會返回結果( IOUtils.toString()  comes from Apache Commons IO ):
 

public String downloadContents(URL url) throws IOException {  try(InputStream input = url.openStream()) {    return IOUtils.toString(input, StandardCharsets.UTF_8);  }} //... final Future<String> contents = downloadContents(new URL("http://www.example.com"));

downloadContents() 看上去是無害的, 但是它需要任意長的時間來完成。同時,為了減少延遲,在等待結果的期間,你可能需要同時獨立的處理其它的工作。以前你可能會啟動一個新的線程 或者等待結果(共享內存,鎖,糟糕的 wait()/notify()對).

通過 Future<T> 模式,它會變得明朗:
 

public static Future<String> startDownloading(URL url) {  //...} final Future<String> contentsFuture = startDownloading(new URL("http://www.example.com"));//other computationfinal String contents = contentsFuture.get();

我們馬上會實現 startDownloading(), startDownloading()不會被阻塞,而是等待外部的站點回應,你理解這一原則是很重要的。 相反,如果它快速返回了,返回一個輕量級的Future<String> 對象。 這個對象是一個promise那么將來字符串類型就是可用的,雖然我們不知道什么時候,但是會保留這個引用直到它返有結果返回,你就可以通過Future.get()來獲取它。 換句話說,Future是一個代理或者一個對象的包裝,不是真實的目標對象。一旦異步計算完成,你就可以提取它。 那么Future提供了什么樣的接口呢?

Future.get()是最重要的方法。它阻塞和等待直到承諾的結果是可用狀態, 因此如果我們確實需要這個字符串,就調用get() 方法然后等待。 還有一個接受超時參數的重載版本,如果哪里出現問題你就不用一直等待下去,超過設定時間就會拋出 TimeoutException。


在某些情況下,你可能想不停地偷偷看看Future是否可用了。這可以通過isDone()來完成。想象一個情景,你的用戶等待某些異步的計算,你想讓他知道這種情況, 同時去做一些其它的計算:
 

final Future<String> contentsFuture = startDownloading(new URL("http://www.example.com"));while (!contentsFuture.isDone()) {  askUserToWait();  doSomeComputationInTheMeantime();}contentsFuture.get();

最后Future.get()調用的內容會保證馬上返回,不會被阻塞,因為Future.isDone() 返回了true。如果你遵循這個模式,就不會忙于每秒百萬次的交替等待和調用isDone()。


取消futrues是最后一個我們還沒有覆蓋到的。想象你啟動了異步的工作并且你只能等待一些時間, 如果2秒鐘后,我們放棄,或者把錯誤傳遞出去,或者采用臨時方案解決它。然而,你是一個好市民,你應該告訴這個future對象:我不需要你了,你別管了。 那么你可以通過停止過時的任務,來節約資源。語法很簡單:
 

contentsFuture.cancel(true);  //meh...


我們都喜歡隱藏的,布爾類型的參數,對嗎?取消可以通過兩種方式來實現:在任務啟動前通過傳遞false參數來取消,前提是當Future表達的結果計算開始之前。一旦Callable.call()已經運行到一半,那么我們想讓它結束,如果我們傳遞true,那么Future.call()就會具有侵入性,試圖打斷正在運行的工作。你覺得這樣好嗎?現象那些拋出InterruptedException這個聲名狼藉的異常的方法,如Thread.sleep(), Object.wait(),Condition.await(),等,甚至包括Future.get(). 如果你被阻塞在這種方法并且有人決定取消你的調用,他們會毫無疑問的拋出InterruptionException,并發出有人要打斷當前運行的任務。


因此我們現在明白了Future是什么--- 一個占位符,你可以在未來得到目標對象。就像對于一輛車,還沒有制造出來的鑰匙。但是你怎樣才能在應用程序中獲得Future的實例? 兩種最普通的資源是線程池和異步方法(線程池支持)。因此, startDownloading()方法可以被重寫為:
 

private final ExecutorService pool = Executors.newFixedThreadPool(10); public Future<String> startDownloading(final URL url) throws IOException {  return pool.submit(new Callable<String>() {    @Override    public String call() throws Exception {      try (InputStream input = url.openStream()) {        return IOUtils.toString(input, StandardCharsets.UTF_8);      }    }  });}


雖然有大量的繁瑣的語法問題,但是基本思想是簡單的: 把需要長時間運行的計算包裝到可調用的<String>,并submit()到線程池,這個線程池包含10個線程。 提交后返回Future<String>的實現,就像以某種方式鏈接到你的任務和線程池。明顯的你的任務不會被立即執行,相反它被放到一個隊列中,稍后會被線程拉出來, 現在需要搞清楚cancel()的兩個特別的意義是什么――你可以取消在隊列中停留的任務,也可以取消早已運行的任務,但這是一件比較復雜的事情。


你還可以在Spring 和 EJB 碰上Future。比如Spring框架的中你可以為方法加入@Async的注解:

@Asyncpublic Future<String> startDownloading(final URL url) throws IOException {  try (InputStream input = url.openStream()) {    return new AsyncResult<>(        IOUtils.toString(input, StandardCharsets.UTF_8)    );  }}


注意,我們簡單地通過包裝結果到AsyncResult來實現Future,但是這個方法本身不會與線程池交互或者異步處理。稍后 Spring會代理所有的調用來startDownloading()并在線程池中執行。 在EJB中,相同的特性通過加@Asynchronousannotation 來完成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频在线免费观看| 夜夜嗨av一区二区三区四区| 久久久久久一区二区三区| 国产精品极品美女在线观看免费| 国产欧美精品日韩| 中文字幕日韩av电影| 国产成人精品国内自产拍免费看| 国产精品久久一区主播| 中文字幕免费国产精品| 色综久久综合桃花网| 国产精品久久久久久久9999| 久久91亚洲人成电影网站| 亚洲欧美综合另类中字| 精品国产电影一区| 97免费在线视频| 日韩精品www| 精品国产精品自拍| 国产视频精品在线| 亚洲国产高清自拍| 亚洲最大av在线| 亚洲天堂av高清| 91香蕉国产在线观看| 午夜精品国产精品大乳美女| 亚洲九九九在线观看| 亚洲欧美福利视频| 亚洲一区二区自拍| 国产91精品久久久久久久| 久久99精品视频一区97| 综合国产在线视频| 精品香蕉在线观看视频一| 久久艳片www.17c.com| 国产欧美精品在线| 精品国内产的精品视频在线观看| 日韩欧美国产视频| 亚洲级视频在线观看免费1级| 国产精品专区一| 69视频在线免费观看| 久久中文字幕一区| 91成人天堂久久成人| 国产成人中文字幕| 国产成人亚洲综合91| 97久久精品在线| 91精品久久久久久久久久久久久久| 97在线观看视频| 欧美一级大片在线观看| 久久精品国产久精国产一老狼| 色综合老司机第九色激情| 欧美一级黄色网| 欧美国产中文字幕| 日韩欧美国产免费播放| 欧美怡红院视频一区二区三区| 亚洲欧美精品在线| 欧美国产视频一区二区| 国产精品久久久久7777婷婷| 精品久久久久久久久国产字幕| 91视频88av| yw.139尤物在线精品视频| 国产欧美一区二区三区在线| 亚洲一级免费视频| 欧美大尺度电影在线观看| 欧美久久精品一级黑人c片| 国产一区二区三区在线视频| 亚洲精品动漫久久久久| 黑人欧美xxxx| 久久99国产精品久久久久久久久| 久久精品在线播放| 欧美午夜激情小视频| 久久69精品久久久久久国产越南| 欧美与欧洲交xxxx免费观看| 在线中文字幕日韩| 欧美一级高清免费播放| 国产免费亚洲高清| 69久久夜色精品国产7777| 日韩亚洲一区二区| 欧美一级成年大片在线观看| 亚洲欧洲成视频免费观看| 日韩欧美国产黄色| 国产在线观看不卡| 97视频在线观看免费| 久久av资源网站| 欧美丰满少妇xxxx| 国产欧美精品一区二区三区介绍| 日韩美女av在线免费观看| 日韩欧美国产中文字幕| 狠狠干狠狠久久| 国产精品久久久久久久天堂| 国产成人精品视频| 久久久久久九九九| 日韩av在线高清| 国内成人精品一区| 97视频国产在线| 欧洲一区二区视频| 亚洲片在线观看| 欧美情侣性视频| 4438全国亚洲精品在线观看视频| 久久精品国产亚洲精品2020| 高清欧美一区二区三区| 欧美日韩国产区| 亚洲黄色免费三级| 国产91av在线| 日韩成人中文字幕| 北条麻妃在线一区二区| 国产成人精品国内自产拍免费看| 久久精品国产清自在天天线| 日韩成人性视频| 亚洲三级免费看| 亚洲第一av网| 国产精品三级久久久久久电影| 亚洲网站在线看| 日韩a**中文字幕| 91麻豆桃色免费看| 亚洲永久在线观看| 亚洲免费视频观看| 欧美激情免费观看| 欧美激情按摩在线| 亚洲激情视频网站| 美女国内精品自产拍在线播放| 不卡在线观看电视剧完整版| 性视频1819p久久| 91手机视频在线观看| www日韩中文字幕在线看| 中文字幕久久久av一区| 国产日韩视频在线观看| 亚洲精品乱码久久久久久按摩观| www.国产精品一二区| 中文字幕日韩av综合精品| 欧美日韩电影在线观看| 久久久久久国产精品| 欧美精品久久久久久久久久| 亚洲欧美一区二区精品久久久| 久久99热精品这里久久精品| 日韩国产欧美区| 欧美亚洲视频在线看网址| 亚洲xxxx做受欧美| 国产一区二区色| 日本成人在线视频网址| 欧美高清无遮挡| 欧美性受xxxx白人性爽| 国产精品一区二区三区久久久| 国产日韩亚洲欧美| 久久在线免费观看视频| 久久九九有精品国产23| 成人性教育视频在线观看| 日韩视频免费中文字幕| 国产日本欧美在线观看| 亚洲国内精品在线| 国产精品日韩欧美综合| 在线成人免费网站| 日韩av电影在线播放| 成人免费看黄网站| 亚洲国产精彩中文乱码av在线播放| 在线午夜精品自拍| 亚洲精品www久久久| 国产精品三级久久久久久电影| 国产美女搞久久| 国产精品亚洲激情| 国产精品av电影| 欧美极品少妇xxxxⅹ免费视频| 国产综合在线视频| 中文字幕久精品免费视频| 久久6精品影院| 欧美黑人性猛交| 97欧美精品一区二区三区| 精品国产户外野外|