1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      Java線程池FutureTask實(shí)現(xiàn)原理的示例分析

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

      我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、華池ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的華池網(wǎng)站制作公司

      前言

      線程池可以并發(fā)執(zhí)行多個(gè)任務(wù),有些時(shí)候,我們可能想要跟蹤任務(wù)的執(zhí)行結(jié)果,甚至在一定時(shí)間內(nèi),如果任務(wù)沒(méi)有執(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,這一切是通過(guò)RunnableAdapter這個(gè)適配器來(lái)實(shí)現(xiàn)的。如下為RunnableAdapter的源碼:

      static final class RunnableAdapter implements Callable {
          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)原理

      通過(guò)上一小節(jié)的了解,我們知道提交的Runnable任務(wù)在內(nèi)部統(tǒng)一被轉(zhuǎn)換為Callable任務(wù)。查看submit方法的返回值,為一個(gè)Future,實(shí)際上這個(gè)Futrue為FutureTask實(shí)例,通過(guò)此實(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ù)過(guò)程比較簡(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() 過(guò)程中有多個(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ù)的取消功能,這一切都是通過(guò) FutureTask的state狀態(tài)來(lái)協(xié)調(diào)多個(gè)線程的。

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


      文章標(biāo)題:Java線程池FutureTask實(shí)現(xiàn)原理的示例分析
      新聞來(lái)源:http://ef60e0e.cn/article/pjeosd.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        深州市| 临泉县| 仁寿县| 高平市| 阿拉善盟| 房山区| 绩溪县| 铜山县| 灵川县| 靖州| 汝州市| 汤原县| 吴江市| 毕节市| 清流县| 信丰县| 府谷县| 城市| 淳化县| 比如县| 台江县| 浙江省| 洪江市| 喜德县| 綦江县| 东乌珠穆沁旗| 朝阳区| 顺义区| 宁陵县| 兴化市| 乡城县| 娱乐| 巴林右旗| 阿尔山市| 象山县| 阿拉尔市| 富锦市| 涟水县| 祁连县| 万源市| 亳州市|