日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JAVA Future類的使用詳解

瀏覽:33日期:2022-08-14 15:51:38
前言

在高性能編程中,并發編程已經成為了極為重要的一部分。在單核CPU性能已經趨于極限時,我們只能通過多核來進一步提升系統的性能,因此就催生了并發編程。

由于并發編程比串行編程更困難,也更容易出錯,因此,我們就更需要借鑒一些前人優秀的,成熟的設計模式,使得我們的設計更加健壯,更加完美。

而Future模式,正是其中使用最為廣泛,也是極為重要的一種設計模式。今天就跟阿丙了解一手Future模式!

生活中的Future模式

為了更快的了解Future模式,我們先來看一個生活中的例子。

場景1:

午飯時間到了,同學們要去吃飯了,小王下樓,走了20分鐘,來到了肯德基,點餐,排隊,吃飯一共花了20分鐘,又花了20分鐘走回公司繼續工作,合計1小時。

場景2

午飯時間到了,同學們要去吃飯了,小王點了個肯德基外賣,很快,它就拿到了一個訂單(雖然訂單不能當飯吃,但是有了訂單,還怕吃不上飯嘛)。接著小王可以繼續干活,30分鐘后,外賣到了,接著小王花了10分鐘吃飯,接著又可以繼續工作了,成功的卷到了隔壁的小汪。

JAVA Future類的使用詳解

很明顯,在這2個場景中,小王的工作時間更加緊湊,特別是那些排隊的時間都可以讓外賣員去干,因此可以更加專注于自己的本職工作。聰明的你應該也已經體會到了,場景1就是典型的函數同步調用,而場景2是典型的異步調用。

而場景2的異步調用,還有一個特點,就是它擁有一個返回值,這個返回值就是我們的訂單。這個訂單很重要,憑借著這個訂單,我們才能夠取得當前這個調用所對應的結果。

這里的訂單就如同Future模式中的Future,這是一個合約,一份承諾。雖然訂單不能吃,但是手握訂單,不怕沒吃的,雖然Future不是我們想要的結果,但是拿著Future就能在將來得到我們想要的結果。

因此,Future模式很好的解決了那些需要返回值的異步調用。

Future模式中的主要角色

一個典型的Future模式由以下幾個部分組成:

Main:系統啟動,調用Client發出請求 Client:返回Data對象,立即返回FutureData,并開啟ClientThread線程裝配RealData Data:返回數據的接口 FutureData:Future數據,構造很快,但是是一個虛擬的數據,需要裝配RealData,好比一個訂單 RealData:真實數據,其構造是比較慢的,好比上面例子中的肯德基午餐。

它們之間的相互關系如下圖:

JAVA Future類的使用詳解

其中,值得注意是Data,RealData和FutureData。這是一組典型的代理模式,Data接口表示對外數據,RealData表示真實的數據,就好比午餐,獲得它的成本比較高,需要很多時間;相對的FutureData作為RealData的代理,類似于一個訂單/契約,通過FutureData,可以在將來獲得RealData。

因此,Future模式本質上是代理模式的一種實際應用。

實現一個簡單的Future模式

根據上面的設計,讓我們來實現一個簡單的代理模式吧!

首先是Data接口,代表數據:

public interface Data { public String getResult ();}

接著是FutureData,也是整個Future模式的核心:

public class FutureData implements Data { // 內部需要維護RealData protected RealData realdata = null; protected boolean isReady = false; public synchronized void setRealData(RealData realdata) {if (isReady) { return;}this.realdata = realdata;isReady = true;//RealData已經被注入,通知getResult()notifyAll();} //會等待RealData構造完成 public synchronized String getResult() {while (!isReady) { try {//一直等待,直到RealData被注入wait(); } catch (InterruptedException e) { }}//真正需要的數據從RealData獲取return realdata.result;}}

下面是RealData:

public class RealData implements Data { protected final String result; public RealData(String para) {StringBuffer sb=new StringBuffer();//假設這里很慢很慢,構造RealData不是一個容易的事result =sb.toString(); } public String getResult() {return result; }}

然后從Client得到Data:

public class Client { //這是一個異步方法,返回的Data接口是一個Future public Data request(final String queryStr) {final FutureData future = new FutureData();new Thread() { public void run() { // RealData的構建很慢,所以在單獨的線程中進行RealData realdata = new RealData(queryStr);//setRealData()的時候會notify()等待在這個future上的對象future.setRealData(realdata); } }.start();// FutureData會被立即返回,不會等待RealData被構造完return future; }}

最后一個Main函數,把所有一切都串起來:

public static void main(String[] args) { Client client = new Client(); //這里會立即返回,因為得到的是FutureData而不是RealData Data data = client.request('name'); System.out.println('請求完畢'); try {//這里可以用一個sleep代替了對其他業務邏輯的處理//在處理這些業務邏輯的過程中,RealData被創建,從而充分利用了等待時間Thread.sleep(2000); } catch (InterruptedException e) { } //使用真實的數據,如果到這里數據還沒有準備好,getResult()會等待數據準備完,再返回 System.out.println('數據 = ' + data.getResult());}

這是一個最簡單的Future模式的實現,雖然簡單,但是已經包含了Future模式中最精髓的部分。對大家理解JDK內部的Future對象,有著非常重要的作用。

Java中的Future模式

Future模式是如此常用,在JDK內部已經有了比較全面的實現和支持。下面,讓我們一起看看JDK內部的Future實現:

JAVA Future類的使用詳解

首先,JDK內部有一個Future接口,這就是類似前面提到的訂單,當然了,作為一個完整的商業化產品,這里的Future的功能更加豐富了,除了get()方法來獲得真實數據以外,還提供一組輔助方法,比如:

cancel():如果等太久,你可以直接取消這個任務 isCancelled():任務是不是已經取消了 isDone():任務是不是已經完成了 get():有2個get()方法,不帶參數的表示無窮等待,或者你可以只等待給定時間

下面代碼演示了這個Future的使用方法:

//異步操作 可以用一個線程池ExecutorService executor = Executors.newFixedThreadPool(1);//執行FutureTask,相當于上例中的 client.request('name') 發送請求//在這里開啟線程進行RealData的call()執行Future<String> future = executor.submit(new RealData('name'));System.out.println('請求完畢,數據準備中');try { //這里依然可以做額外的數據操作,這里使用sleep代替其他業務邏輯的處理 Thread.sleep(2000);} catch (InterruptedException e) {}//如果此時call()方法沒有執行完成,則依然會等待System.out.println('數據 = ' + future.get());

整個使用過程非常簡單,下面我們來分析一下executor.submit()里面究竟發生了什么:

public <T> Future<T> submit(Callable<T> task) {if (task == null) throw new NullPointerException();// 根據Callable對象,創建一個RunnableFuture,這里其實就是FutureTaskRunnableFuture<T> ftask = newTaskFor(task);//將ftask推送到線程池//在新線程中執行的,就是run()方法,在下面的代碼中有給出execute(ftask);//返回這個Future,將來通過這個Future就可以得到執行的結果return ftask; } protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {return new FutureTask<T>(callable); }

最關鍵的部分在下面,FutureTask作為一個線程單獨執行時,會將結果保存到outcome中,并設置任務的狀態,下面是FutureTask的run()方法:

JAVA Future類的使用詳解

從FutureTask中獲得結果的實現如下:

public V get() throws InterruptedException, ExecutionException {int s = state;//如果沒有完成,就等待,回到用park()方法阻塞線程//同時,所有等待線程會在FutureTask的waiters字段中排隊等待if (s <= COMPLETING) s = awaitDone(false, 0L);return report(s); } private V report(int s) throws ExecutionException {//outcome里保存的就是最終的計算結果Object x = outcome;if (s == NORMAL) //正常完成,就返回outcome return (V)x;//如果沒有正常完成, 比如被用戶取消了,或者有異常了,就拋出異常if (s >= CANCELLED) throw new CancellationException();throw new ExecutionException((Throwable)x); }Future模式的高階版本—— CompletableFuture

Future模式雖然好用,但也有一個問題,那就是將任務提交給線程后,調用線程并不知道這個任務什么時候執行完,如果執行調用get()方法或者isDone()方法判斷,可能會進行不必要的等待,那么系統的吞吐量很難提高。

為了解決這個問題,JDK對Future模式又進行了加強,創建了一個CompletableFuture,它可以理解為Future模式的升級版本,它最大的作用是提供了一個回調機制,可以在任務完成后,自動回調一些后續的處理,這樣,整個程序可以把“結果等待”完全給移除了。

下面來看一個簡單的例子:

JAVA Future類的使用詳解

在這個例子中,首先以getPrice()為基礎創建一個異步調用,接著,使用thenAccept()方法,設置了一個后續的操作,也就是當getPrice()執行完成后的后續處理。

不難看到,CompletableFuture比一般的Future更具有實用性,因為它可以在Future執行成功后,自動回調進行下一步的操作,因此整個程序不會有任何阻塞的地方(也就是說你不用去到處等待Future的執行,而是讓Future執行成功后,自動來告訴你)。

以上面的代碼為例,CompletableFuture之所有會有那么神奇的功能,完全得益于AsyncSupply類(由上述代碼中的supplyAsync()方法創建)。

AsyncSupply在執行時,如下所示:

public void run() { CompletableFuture<T> d; Supplier<T> f; if ((d = dep) != null && (f = fn) != null) {dep = null; fn = null;if (d.result == null) { try {//這里就是你要執行的異步方法//結果會被保存下來,放到d.result字段中d.completeValue(f.get()); } catch (Throwable ex) {d.completeThrowable(ex); }}//執行成功了,進行后續處理,在這個后續處理中,就會調用thenAccept()中的消費者//這里就相當于Future完成后的通知d.postComplete(); }}

繼續看d.postComplete(),這里會調用后續一系列操作

final void postComplete() {//省略部分代碼,重點在tryFire()里//在tryFire()里,真正觸發了后續的調用,也就是thenAccept()中的部分f = (d = h.tryFire(NESTED)) == null ? this : d; }} }絮叨

今天,我們主要介紹Future模式,我們從一個最簡單的Future模式開始,逐步深入,先后介紹了JDK內部的Future模式實現,以及對Future模式的進化版本CompletableFuture做了簡單的介紹。對

于多線程開發而言,Future模式的應用極其廣泛,可以說這個模式已經成為了異步開發的基礎設施。

以上就是JAVA Future類的使用詳解的詳細內容,更多關于JAVA Future類的使用的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一级| 久久国产精品色av免费看| 麻豆精品视频在线观看视频| 国产精品网址| 日韩国产专区| 欧美日韩国产一区二区三区不卡| 亚洲激情久久| 91精品国产自产精品男人的天堂| 国产欧美亚洲一区| 四虎成人av| 尤物精品在线| 国产乱人伦丫前精品视频| 精品欧美一区二区三区在线观看| 天堂av在线| 视频在线观看一区二区三区| 欧美激情福利| 亚洲综合日韩| 成人一区不卡| 日韩欧美2区| 中文字幕一区久| 少妇精品在线| 亚洲特级毛片| 粉嫩av一区二区三区四区五区| 伊人久久大香线蕉av超碰演员| 麻豆国产精品一区二区三区| 亚洲在线网站| 日本免费久久| 欧美在线看片| 色偷偷色偷偷色偷偷在线视频| 蜜臀久久久久久久| 欧洲av一区二区| 国产精品视频首页| 综合国产精品| 自由日本语亚洲人高潮| 欧美丰满日韩| 国产精品欧美三级在线观看 | 亚洲一区不卡| 在线 亚洲欧美在线综合一区| 欧美一级网址| 美女尤物久久精品| 精品美女视频| 亚洲欧美网站| 国产日韩一区二区三区在线| yellow在线观看网址| 国产精品一区二区99| 亚洲一区二区毛片| 国产精品视频一区二区三区四蜜臂| 高清av不卡| 日韩不卡一二三区| 青青国产91久久久久久| 亚洲欧美日韩国产综合精品二区| 国产福利片在线观看| 日韩激情啪啪| 999久久久免费精品国产| 亚洲精品影院在线观看| 久久免费黄色| 亚洲女同av| 亚洲欧洲高清| 欧美成人a交片免费看| 国产欧美大片| 蜜桃视频一区二区三区 | 亚洲另类av| 国产在线成人| 蜜桃国内精品久久久久软件9| 精品国产第一福利网站| 国产一区二区三区久久| 国产一区日韩| 久久影视三级福利片| 久久三级毛片| 荡女精品导航| 亚洲综合电影| 日本а中文在线天堂| 97在线精品| 999国产精品999久久久久久| 久久视频一区| 亚洲免费影视| 91精品啪在线观看国产爱臀| 国产精品日韩精品中文字幕| 欧美国产另类| 国产福利亚洲| 日韩av三区| 久久国产人妖系列| 久久国内精品| 91九色精品| 香蕉视频成人在线观看| 欧美精品不卡| 国产aⅴ精品一区二区四区| 91精品xxx在线观看| 亚洲欧洲美洲国产香蕉| 国产亚洲一卡2卡3卡4卡新区| 奇米色欧美一区二区三区| 久久影视三级福利片| 日韩精品中文字幕第1页| 亚洲激情二区| 麻豆视频一区二区| 国产视频一区在线观看一区免费| 久久久久观看| 国产在线看片免费视频在线观看| 99精品在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 免播放器亚洲一区| 久久伊人国产| 69堂精品视频在线播放| 97精品一区| 欧美精品国产| 日韩欧美午夜| 国产精品色在线网站| 成人av二区| 久久精品午夜| 激情自拍一区| 日韩av一区二区三区四区| 91精品蜜臀一区二区三区在线| 日韩中文字幕av电影| 不卡福利视频| 蜜桃精品视频| 国产免费播放一区二区| 久久久久.com| 国内在线观看一区二区三区| 在线 亚洲欧美在线综合一区| 卡一卡二国产精品| 亚洲婷婷丁香| 97在线精品| 欧美亚洲免费| 91麻豆精品| 国产在线欧美| jizzjizz中国精品麻豆| 国产日韩中文在线中文字幕| 日韩三级久久| 亚洲一区免费| 妖精视频成人观看www| 中文另类视频| 免费精品视频| 国产精品网址| 日韩精品第一| 亚洲一区二区小说| 一区在线观看| 欧美午夜精彩| 日韩精品一区二区三区免费观影| 中文字幕人成乱码在线观看| 欧美日韩中出| 国产乱码精品一区二区亚洲| 亚洲日本在线观看视频| 一区二区电影| 国产探花在线精品| 福利一区和二区| 日韩av在线播放网址| 国产一区二区三区不卡av| 精品国产黄a∨片高清在线| 国产精品入口久久| 精品国产99| 成人久久久久| 老司机精品久久| 日韩福利视频网| 国产精品久久久久77777丨| 婷婷综合国产| 亚洲欧美日韩精品一区二区| 国产精品九九| 精品国产a一区二区三区v免费| 国产精品一国产精品| 久久精品国产福利| 久久久久美女| 欧美一级精品| 91成人精品观看| 亚洲播播91| 国产精品片aa在线观看| 亚洲精品99| 久久wwww| 影音先锋久久精品| 日韩高清中文字幕一区二区| 爽好久久久欧美精品| 精品淫伦v久久水蜜桃| 亚洲精品网址| 国产成人精品福利| 日韩一区二区三区精品| 在线看片一区| 日韩一区电影| 国产精品66| 老色鬼精品视频在线观看播放| 日韩av网站免费在线| 日本精品另类| 日韩中文字幕| 国产一区日韩欧美| 久久中文精品| 97人人精品| 美腿丝袜亚洲三区| 亚洲va中文在线播放免费| 免费视频一区三区| 欧美色综合网| 国内亚洲精品| 日韩成人精品一区| 好看的亚洲午夜视频在线| 亚洲永久精品唐人导航网址| 野花国产精品入口| 在线 亚洲欧美在线综合一区| 91综合网人人| 免费一二一二在线视频| 亚洲91视频| 国产日韩专区| 日韩**一区毛片| 日韩av字幕|