最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

了解JAVA Future類

 更新時(shí)間:2019年06月04日 10:18:22   作者:石碩頁(yè)  
Future是并發(fā)編程中的一種設(shè)計(jì)模式,F(xiàn)uture它代表一個(gè)異步計(jì)算的結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面小編和大家來(lái)一起學(xué)習(xí)一下吧

1. Future的應(yīng)用場(chǎng)景

在并發(fā)編程中,我們經(jīng)常用到非阻塞的模型,在之前的多線程的三種實(shí)現(xiàn)中,不管是繼承thread類還是實(shí)現(xiàn)runnable接口,都無(wú)法保證獲取到之前的執(zhí)行結(jié)果。通過實(shí)現(xiàn)Callback接口,并用Future可以來(lái)接收多線程的執(zhí)行結(jié)果。

Future表示一個(gè)可能還沒有完成的異步任務(wù)的結(jié)果,針對(duì)這個(gè)結(jié)果可以添加Callback以便在任務(wù)執(zhí)行成功或失敗后作出相應(yīng)的操作。

舉個(gè)例子:比如去吃早點(diǎn)時(shí),點(diǎn)了包子和涼菜,包子需要等3分鐘,涼菜只需1分鐘,如果是串行的一個(gè)執(zhí)行,在吃上早點(diǎn)的時(shí)候需要等待4分鐘,但是因?yàn)槟阍诘劝拥臅r(shí)候,可以同時(shí)準(zhǔn)備涼菜,所以在準(zhǔn)備涼菜的過程中,可以同時(shí)準(zhǔn)備包子,這樣只需要等待3分鐘。那Future這種模式就是后面這種執(zhí)行模式。

2. Future的類圖結(jié)構(gòu)

Future接口定義了主要的5個(gè)接口方法,有RunnableFuture和SchedualFuture繼承這個(gè)接口,以及CompleteFuture和ForkJoinTask繼承這個(gè)接口。

RunnableFuture

這個(gè)接口同時(shí)繼承Future接口和Runnable接口,在成功執(zhí)行run()方法后,可以通過Future訪問執(zhí)行結(jié)果。

這個(gè)接口都實(shí)現(xiàn)類是FutureTask,一個(gè)可取消的異步計(jì)算,這個(gè)類提供了Future的基本實(shí)現(xiàn),后面我們的demo也是用這個(gè)類實(shí)現(xiàn),它實(shí)現(xiàn)了啟動(dòng)和取消一個(gè)計(jì)算,查詢這個(gè)計(jì)算是否已完成,恢復(fù)計(jì)算結(jié)果。計(jì)算的結(jié)果只能在計(jì)算已經(jīng)完成的情況下恢復(fù)。

如果計(jì)算沒有完成,get方法會(huì)阻塞,一旦計(jì)算完成,這個(gè)計(jì)算將不能被重啟和取消,除非調(diào)用runAndReset方法。

FutureTask能用來(lái)包裝一個(gè)Callable或Runnable對(duì)象,因?yàn)樗鼘?shí)現(xiàn)了Runnable接口,而且它能被傳遞到Executor進(jìn)行執(zhí)行。為了提供單例類,這個(gè)類在創(chuàng)建自定義的工作類時(shí)提供了protected構(gòu)造函數(shù)。

SchedualFuture

這個(gè)接口表示一個(gè)延時(shí)的行為可以被取消。通常一個(gè)安排好的future是定時(shí)任務(wù)SchedualedExecutorService的結(jié)果

CompleteFuture

一個(gè)Future類是顯示的完成,而且能被用作一個(gè)完成等級(jí),通過它的完成觸發(fā)支持的依賴函數(shù)和行為。當(dāng)兩個(gè)或多個(gè)線程要執(zhí)行完成或取消操作時(shí),只有一個(gè)能夠成功。

ForkJoinTask

基于任務(wù)的抽象類,可以通過ForkJoinPool來(lái)執(zhí)行。一個(gè)ForkJoinTask是類似于線程實(shí)體,但是相對(duì)于線程實(shí)體是輕量級(jí)的。大量的任務(wù)和子任務(wù)會(huì)被ForkJoinPool池中的真實(shí)線程掛起來(lái),以某些使用限制為代價(jià)。

3. Future的主要方法

Future接口主要包括5個(gè)方法

get()方法可以當(dāng)任務(wù)結(jié)束后返回一個(gè)結(jié)果,如果調(diào)用時(shí),工作還沒有結(jié)束,則會(huì)阻塞線程,直到任務(wù)執(zhí)行完畢

get(long timeout,TimeUnit unit)做多等待timeout的時(shí)間就會(huì)返回結(jié)果

cancel(boolean mayInterruptIfRunning)方法可以用來(lái)停止一個(gè)任務(wù),如果任務(wù)可以停止(通過mayInterruptIfRunning來(lái)進(jìn)行判斷),則可以返回true,如果任務(wù)已經(jīng)完成或者已經(jīng)停止,或者這個(gè)任務(wù)無(wú)法停止,則會(huì)返回false.

isDone()方法判斷當(dāng)前方法是否完成

isCancel()方法判斷當(dāng)前方法是否取消

4. Future示例demo

需求場(chǎng)景:等早餐過程中,包子需要3秒,涼菜需要1秒,普通的多線程需要四秒才能完成。先等涼菜,再等包子,因?yàn)榈葲霾藭r(shí),普通多線程啟動(dòng)start()方法,執(zhí)行run()中具體方法時(shí),沒有返回結(jié)果,所以如果要等有返回結(jié)果,必須是要1秒結(jié)束后才知道結(jié)果。

普通多線程:

public class BumThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(1000*3);
System.out.println("包子準(zhǔn)備完畢");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ColdDishThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("涼菜準(zhǔn)備完畢");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
// 等涼菜 -- 必須要等待返回的結(jié)果,所以要調(diào)用join方法
Thread t1 = new ColdDishThread();
t1.start();
t1.join();
// 等包子 -- 必須要等待返回的結(jié)果,所以要調(diào)用join方法
Thread t2 = new BumThread();
t2.start();
t2.join();
long end = System.currentTimeMillis();
System.out.println("準(zhǔn)備完畢時(shí)間:"+(end-start));
}

采用Future模式:

public static void main(String[] args) throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
// 等涼菜 
Callable ca1 = new Callable(){
@Override
public String call() throws Exception {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "涼菜準(zhǔn)備完畢";
}
};
FutureTask<String> ft1 = new FutureTask<String>(ca1);
new Thread(ft1).start();
// 等包子 -- 必須要等待返回的結(jié)果,所以要調(diào)用join方法
Callable ca2 = new Callable(){
@Override
public Object call() throws Exception {
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "包子準(zhǔn)備完畢";
}
};
FutureTask<String> ft2 = new FutureTask<String>(ca2);
new Thread(ft2).start();
System.out.println(ft1.get());
System.out.println(ft2.get());
long end = System.currentTimeMillis();
System.out.println("準(zhǔn)備完畢時(shí)間:"+(end-start));

Java中Future、FutureTask原理以及與線程池的搭配使用

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • shiro 認(rèn)證流程操作

    shiro 認(rèn)證流程操作

    這篇文章主要介紹了shiro 認(rèn)證操作的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • SpringBoot集成canal實(shí)現(xiàn)示例解析

    SpringBoot集成canal實(shí)現(xiàn)示例解析

    這篇文章主要為大家介紹了springboot整合canal的示例實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多進(jìn)步,早日升職加薪
    2022-02-02
  • spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法

    spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法

    這篇文章主要介紹了spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)

    Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)

    代碼注釋是架起程序設(shè)計(jì)者與程序閱讀者之間的通信橋梁,最大限度的提高團(tuán)隊(duì)開發(fā)合作效率。也是程序代碼可維護(hù)性的重要環(huán)節(jié)之一。下面通過本文說一下我們?cè)谌粘i_發(fā)中使用的代碼注釋規(guī)范
    2017-03-03
  • 基于Java中的數(shù)值和集合詳解

    基于Java中的數(shù)值和集合詳解

    下面小編就為大家?guī)?lái)一篇基于Java中的數(shù)值和集合詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-07-07
  • Spring的@Lazy懶加載注解用法詳細(xì)解析

    Spring的@Lazy懶加載注解用法詳細(xì)解析

    這篇文章主要介紹了Spring的@Lazy懶加載注解用法詳細(xì)解析,SpringIoC容器會(huì)在啟動(dòng)的時(shí)候?qū)嵗袉螌?shí)例 bean ,如果我們想要實(shí)現(xiàn) Spring 在啟動(dòng)的時(shí)候延遲加載 bean,即在首次調(diào)用bean的時(shí)候再去執(zhí)行初始化,就可以使用 @Lazy 注解來(lái)解決這個(gè)問題,需要的朋友可以參考下
    2023-11-11
  • 詳析Spring中依賴注入的三種方式

    詳析Spring中依賴注入的三種方式

    在開發(fā)的過程中突然對(duì)Spring的依賴注入幾種方式出現(xiàn)混交,打算做個(gè)簡(jiǎn)單的小結(jié),方便大家和自己以后參考借鑒,如有總結(jié)不對(duì)的地方,請(qǐng)大家不吝指教!下面來(lái)一起看看吧。
    2016-09-09
  • Springmvc nginx實(shí)現(xiàn)動(dòng)靜分離過程詳解

    Springmvc nginx實(shí)現(xiàn)動(dòng)靜分離過程詳解

    這篇文章主要介紹了Springmvc nginx實(shí)現(xiàn)動(dòng)靜分離過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java框架Struts2實(shí)現(xiàn)圖片上傳功能

    Java框架Struts2實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了Java框架Struts2實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • SpringCloud應(yīng)用骨架開發(fā)詳解

    SpringCloud應(yīng)用骨架開發(fā)詳解

    這篇文章主要介紹了SpringCloud應(yīng)用骨架開發(fā)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

扎赉特旗| 元氏县| 昆山市| 大化| 阜南县| 江门市| 凭祥市| 神农架林区| 鄂尔多斯市| 渝中区| 彭阳县| 隆德县| 鄂州市| 三门县| 古浪县| 长顺县| 临海市| 松潘县| 鹤壁市| 积石山| 分宜县| 策勒县| 商都县| 望城县| 柏乡县| 德钦县| 芷江| 九寨沟县| 静乐县| 滕州市| 德昌县| 昭通市| 延庆县| 阿克苏市| 九龙县| 江孜县| 江华| 香港 | 正定县| 陆良县| 庄浪县|