中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Java線程池FutureTask實(shí)現(xiàn)原理的示例分析-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Java線程池FutureTask實(shí)現(xiàn)原理的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)內(nèi)江服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
前言

線程池可以并發(fā)執(zhí)行多個(gè)任務(wù),有些時(shí)候,我們可能想要跟蹤任務(wù)的執(zhí)行結(jié)果,甚至在一定時(shí)間內(nèi),如果任務(wù)沒有執(zhí)行完成,我們可能還想要取消任務(wù)的執(zhí)行,為了支持這一特性,ThreadPoolExecutor提供了 FutureTask 用于追蹤任務(wù)的執(zhí)行和取消。

類視圖

為了更好的理解FutureTask的實(shí)現(xiàn)原理,這里先提供幾個(gè)重要接口和類的結(jié)構(gòu),如下圖所示:

Java線程池FutureTask實(shí)現(xiàn)原理的示例分析

RunnableAdapter

ThreadPoolExecutor提供了submit接口用于提交任務(wù),submit支持Runnable和Callable兩種不同的接口,為了提供統(tǒng)一的對(duì)外接口,jdk在內(nèi)部把Runnable給包裝成了一個(gè)Callable,這一切是通過RunnableAdapter這個(gè)適配器來實(shí)現(xiàn)的。如下為RunnableAdapter的源碼:

static final class RunnableAdapter<T> implements Callable<T> {
    final Runnable task;
    final T result;
    RunnableAdapter(Runnable task, T result) {
      this.task = task;
      this.result = result;
    }
    public T call() {
      task.run();
      return result;
    }
  }

RunnableAdapter是Callable 的實(shí)現(xiàn)類,實(shí)現(xiàn)了call方法,而call方法僅僅是調(diào)用task.run(),然后return result,這樣就能夠確保在內(nèi)部只需要統(tǒng)一處理Callable接口。

FutureTask實(shí)現(xiàn)原理

通過上一小節(jié)的了解,我們知道提交的Runnable任務(wù)在內(nèi)部統(tǒng)一被轉(zhuǎn)換為Callable任務(wù)。查看submit方法的返回值,為一個(gè)Future,實(shí)際上這個(gè)Futrue為FutureTask實(shí)例,通過此實(shí)例,調(diào)用get方法,可以阻塞當(dāng)前線程,直到任務(wù)運(yùn)行完畢,返回結(jié)果。

整個(gè)調(diào)用鏈條如下所示:

worker thread -> futureTask.run() -> callable.call() -> task.run()

如果提交的是Callable任務(wù),則只有前面三個(gè)調(diào)用。

為了更好的展示整個(gè)流程,下面舉例演示一遍執(zhí)行流程。

1、 向線程池submit一個(gè)Callable任務(wù)(Runnable也會(huì)被轉(zhuǎn)為Callable), 這時(shí)候Callable被傳入一個(gè)FutureTask實(shí)例中,如下所示:

Java線程池FutureTask實(shí)現(xiàn)原理的示例分析

2、線程池使用一個(gè)線程,執(zhí)行這個(gè) FutureTask 任務(wù),

Java線程池FutureTask實(shí)現(xiàn)原理的示例分析

線程執(zhí)行任務(wù)過程比較簡(jiǎn)單,最終會(huì)調(diào)用Callable.call()或者是 Runnable.run()方法,然后得到一個(gè)結(jié)果,把結(jié)果存儲(chǔ)在FutureTask實(shí)例的outcome屬性中,同時(shí)把狀態(tài)修改為NORMAL,表明任務(wù)已經(jīng)執(zhí)行完畢,可以獲取結(jié)果了。

我們假設(shè)在執(zhí)行 callable.call() 過程中有多個(gè)線程調(diào)用了 同個(gè)FutureTask實(shí)例的get方法,這時(shí)候,這些線程會(huì)被阻塞,存于一個(gè)棧中, 如下圖所示:

Java線程池FutureTask實(shí)現(xiàn)原理的示例分析

線程1,2,3調(diào)用FutureTask.get方法,由于任務(wù)未執(zhí)行結(jié)束,這時(shí)候,三個(gè)線程都將被阻塞休眠,F(xiàn)utureTask中有一個(gè)棧,用于存放等待線程,棧頂指針為 FutureTask.waiters引用,當(dāng)任務(wù)執(zhí)行完畢后,會(huì)迭代喚醒整個(gè)棧中的線程,這時(shí)候,各個(gè)線程都將被喚醒,并且可以順利拿到任務(wù)的執(zhí)行結(jié)果(執(zhí)行結(jié)果存于 FutureTask.outcome) 。

FutureTask還支持任務(wù)的取消功能,這一切都是通過 FutureTask的state狀態(tài)來協(xié)調(diào)多個(gè)線程的。

關(guān)于“Java線程池FutureTask實(shí)現(xiàn)原理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

標(biāo)題名稱:Java線程池FutureTask實(shí)現(xiàn)原理的示例分析-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://www.rwnh.cn/article48/dpecep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、App設(shè)計(jì)、網(wǎng)站改版云服務(wù)器品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
库车县| 游戏| 永昌县| 泽州县| 绥棱县| 苗栗市| 闽侯县| 南康市| 甘肃省| 绿春县| 平邑县| 邓州市| 阿坝| 家居| 南江县| 沙田区| 夏津县| 芦山县| 大悟县| 黎平县| 航空| 淮南市| 京山县| 六枝特区| 普兰店市| 澄迈县| 夹江县| 静乐县| 杭锦旗| 滕州市| 霍州市| 汉阴县| 儋州市| 泰宁县| 永新县| 金昌市| 巫溪县| 固始县| 休宁县| 正阳县| 景谷|