国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java線(xiàn)程池FutureTask實(shí)現(xiàn)原理詳解

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

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

這篇文章主要介紹了Java線(xiàn)程池FutureTask實(shí)現(xiàn)原理詳解,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

前言

線(xiàn)程池可以并發(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)原理

類(lèi)視圖

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

Java線(xiàn)程池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的源碼:

?
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 的實(shí)現(xiàn)類(lèi),實(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)前線(xiàn)程,直到任務(wù)運(yùn)行完畢,返回結(jié)果。

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

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

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

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

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

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

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

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

線(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è)線(xiàn)程調(diào)用了 同個(gè)futuretask實(shí)例的get方法,這時(shí)候,這些線(xiàn)程會(huì)被阻塞,存于一個(gè)棧中, 如下圖所示:

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

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

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

總結(jié)

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91社区在线观看 | 欧美激情一区二区三级高清视频 | www日韩| 国内自拍视频在线观看 | 久久精品| 中文字幕影院 | 日本视频二区 | 欧美在线视频不卡 | 免费国产视频 | 一级做a爰片久久高潮 | 久久免费国产精品 | 午夜视频在线网站 | 国产精品资源在线观看 | 亚洲精品系列 | 欧美激情视频一区二区三区在线播放 | a视频在线观看免费 | 久久久久无码国产精品一区 | 高清一区在线观看 | 亚洲一区二区三区在线 | 午夜影院在线播放 | 亚洲v在线| 中文字幕免费中文 | 一级黄色免费片 | 日本三级视频在线观看 | 九九精品视频在线观看 | 亚洲精品日本 | 成人免费一区二区三区视频网站 | 涩涩视频在线看 | 久久久久久这里只有精品 | 日韩久久精品一区二区 | 久久在线视频 | 日韩精品1区2区3区 国产日韩在线视频 | 国产精品久久天天躁 | 日本99精品| 亚洲国产精品免费在线观看 | 日韩欧美专区 | 欧洲免费av | 中文字幕亚洲一区 | 亚洲欧美激情精品一区二区 | 中文在线一区二区 | 日韩精品中文字幕在线观看 |