一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java線程池FutureTask實現原理詳解

Java線程池FutureTask實現原理詳解

2021-04-01 12:25那個天真的人 JAVA教程

這篇文章主要介紹了Java線程池FutureTask實現原理詳解,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

前言

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

類視圖

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

Java線程池FutureTask實現原理詳解

runnableadapter

threadpoolexecutor提供了submit接口用于提交任務,submit支持runnable和callable兩種不同的接口,為了提供統一的對外接口,jdk在內部把runnable給包裝成了一個callable,這一切是通過runnableadapter這個適配器來實現的。如下為runnableadapter的源碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
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狀態來協調多個線程的。

總結

futuretask接口是一種實現機制,提供我們對任務的執行的跟蹤以及控制,相比于線程池本身,比較簡單,相信不難理解。

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

原文鏈接:http://blog.csdn.net/yanyan19880509/article/details/52728263

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产高清在线播放刘婷91 | 天天中文 | 4438全国免费观看 | 和岳m的小说 | 精品国产福利片在线观看 | 亚洲成熟人网站 | 精品无码一区二区三区中文字幕 | 天天综合网天天做天天受 | 青草网址| 青青青青青国产免费手机看视频 | 亚洲国产天堂在线观看 | 久久这里只精品国产99re66 | 精品国产自在在线在线观看 | 无码国产成人777爽死在线观看 | 国产好痛疼轻点好爽的视频 | 特黄视频免费看 | 天美传媒tm0087 | 亚洲免费视频播放 | 好姑娘完整版在线观看中文 | 天堂伊人网 | 欧美精品超清在线播放 | 国产一区二区三区在线观看视频 | 91看片淫黄大片在看 | 精品久久一区 | 久久精品美女 | 日本不卡在线一区二区三区视频 | 护士让我吃奶我扒她奶 | 五月婷婷在线免费观看 | 999久久免费高清热精品 | 99rv精品视频在线播放 | 欧美综合精品一区二区三区 | 天天做天天爱天天一爽一毛片 | 国产精品夜夜爽张柏芝 | 女人叉开腿让男人捅 | 日本视频高清免费观看xxx | 欧美一区二区三区免费不卡 | 国产福利兔女郎在线观看 | 婷婷影院在线观看 | 日本高免费观看在线播放 | 日韩高清在线高清免费 | 俄罗斯一级在线播放 |