欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java線程池FutureTask實現(xiàn)原理詳解

 更新時間:2018年02月06日 08:40:46   作者:那個天真的人  
這篇文章主要介紹了Java線程池FutureTask實現(xiàn)原理詳解,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

前言

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

類視圖

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

RunnableAdapter

ThreadPoolExecutor提供了submit接口用于提交任務(wù),submit支持Runnable和Callable兩種不同的接口,為了提供統(tǒng)一的對外接口,jdk在內(nèi)部把Runnable給包裝成了一個Callable,這一切是通過RunnableAdapter這個適配器來實現(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 的實現(xiàn)類,實現(xiàn)了call方法,而call方法僅僅是調(diào)用task.run(),然后return result,這樣就能夠確保在內(nèi)部只需要統(tǒng)一處理Callable接口。

FutureTask實現(xiàn)原理

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

FutureTask接口是一種實現(xiàn)機(jī)制,提供我們對任務(wù)的執(zhí)行的跟蹤以及控制,相比于線程池本身,比較簡單,相信不難理解。

以上就是本文關(guān)于Java線程池FutureTask實現(xiàn)原理詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Java多線程Thread類的使用詳解

    Java多線程Thread類的使用詳解

    這篇文章主要介紹了Java多線程Thread類的使用及注意事項,在java標(biāo)準(zhǔn)庫中提供了一個Thread類來表示/操作線程,Thread類也可以視為是java標(biāo)準(zhǔn)庫提供的API
    2022-12-12
  • 用java WebSocket做一個聊天室

    用java WebSocket做一個聊天室

    這篇文章主要為大家詳細(xì)介紹了用java WebSocket做一個聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 最新hadoop安裝教程及hadoop的命令使用(親測可用)

    最新hadoop安裝教程及hadoop的命令使用(親測可用)

    這篇文章主要介紹了最新hadoop安裝教程(親測可用),本文主要講解了如何安裝hadoop、使用hadoop的命令及遇到的問題解決,需要的朋友可以參考下
    2022-06-06
  • Nacos后臺頻繁打印get changedGroupKeys:[]的問題及解決

    Nacos后臺頻繁打印get changedGroupKeys:[]的問題及解決

    這篇文章主要介紹了Nacos后臺頻繁打印get changedGroupKeys:[]的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 一文詳解MVCC的執(zhí)行原理

    一文詳解MVCC的執(zhí)行原理

    MVCC是一種并發(fā)控制機(jī)制,用于解決數(shù)據(jù)庫并發(fā)訪問中,數(shù)據(jù)一致性問題,它通過在讀寫操作期間保存多個數(shù)據(jù)版本,以提供并發(fā)事務(wù)間的隔離性,本文將和大家簡單聊聊MVCC的執(zhí)行原理,需要的朋友可以參考下
    2023-12-12
  • Java裝飾器設(shè)計模式初探

    Java裝飾器設(shè)計模式初探

    這篇文章主要為大家詳細(xì)介紹了Java裝飾器設(shè)計模式,感興趣的小伙伴們可以參考一下
    2016-09-09
  • SpringBoot配置發(fā)送Email的示例代碼

    SpringBoot配置發(fā)送Email的示例代碼

    本篇文章主要介紹了SpringBoot配置發(fā)送Email的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java常用正則表達(dá)式驗證類完整實例【郵箱、URL、IP、電話、身份證等】

    Java常用正則表達(dá)式驗證類完整實例【郵箱、URL、IP、電話、身份證等】

    這篇文章主要介紹了Java常用正則表達(dá)式驗證類,結(jié)合完整實例形式分析了Java針對郵箱、網(wǎng)址URL、IP地址、電話、身份證等正則驗證相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • java實現(xiàn)哈夫曼壓縮與解壓縮的方法

    java實現(xiàn)哈夫曼壓縮與解壓縮的方法

    這篇文章主要介紹了java實現(xiàn)哈夫曼壓縮與解壓縮的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Mybatis-Plus中的MetaObjectHandler組件的使用

    Mybatis-Plus中的MetaObjectHandler組件的使用

    MetaObjectHandler是Mybatis-Plus中一個實用組件,專門用于自動處理實體對象中的特定字段,如創(chuàng)建時間、更新時間、創(chuàng)建人和修改人等,該接口允許開發(fā)者在不修改業(yè)務(wù)代碼的情況下,實現(xiàn)自動填充功能,極大地簡化了代碼的復(fù)雜性,感興趣的可以了解一下
    2024-10-10

最新評論