91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java線程池FutureTask實現原理的示例分析

發布時間:2021-08-06 11:06:26 來源:億速云 閱讀:138 作者:小新 欄目:編程語言

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

前言

線程池可以并發執行多個任務,有些時候,我們可能想要跟蹤任務的執行結果,甚至在一定時間內,如果任務沒有執行完成,我們可能還想要取消任務的執行,為了支持這一特性,ThreadPoolExecutor提供了 FutureTask 用于追蹤任務的執行和取消。

類視圖

為了更好的理解FutureTask的實現原理,這里先提供幾個重要接口和類的結構,如下圖所示:

Java線程池FutureTask實現原理的示例分析

RunnableAdapter

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

FutureTask實現原理

通過上一小節的了解,我們知道提交的Runnable任務在內部統一被轉換為Callable任務。查看submit方法的返回值,為一個Future,實際上這個Futrue為FutureTask實例,通過此實例,調用get方法,可以阻塞當前線程,直到任務運行完畢,返回結果。

整個調用鏈條如下所示:

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

如果提交的是Callable任務,則只有前面三個調用。

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

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

Java線程池FutureTask實現原理的示例分析

2、線程池使用一個線程,執行這個 FutureTask 任務,

Java線程池FutureTask實現原理的示例分析

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

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

Java線程池FutureTask實現原理的示例分析

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

FutureTask還支持任務的取消功能,這一切都是通過 FutureTask的state狀態來協調多個線程的。

關于“Java線程池FutureTask實現原理的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

从化市| 潞城市| 鸡泽县| 墨脱县| 陵川县| 乌拉特后旗| 二手房| 临漳县| 晋中市| 佛坪县| 潍坊市| 汶上县| 河曲县| 张家川| 麟游县| 上蔡县| 洮南市| 含山县| 普兰县| 金乡县| 洛川县| 大连市| 修水县| 安岳县| 外汇| 龙游县| 百色市| 青神县| 五家渠市| 禄劝| 新宾| 达尔| 湛江市| 威远县| 绥化市| 都昌县| 苏州市| 定结县| 廉江市| 石景山区| 商南县|