日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前面幾篇文章分析了線程的主要實(shí)現(xiàn),今天來整體總結(jié)以下他們。

總覽圖

直接上總結(jié)的總覽圖,如下圖:

一文總結(jié)線程池框架結(jié)構(gòu)體系

 

如果看過前幾篇文章應(yīng)該基本能夠看懂這張總結(jié)圖,可能在單獨(dú)的一篇文章里弄懂了一個知識點(diǎn),但是沒有一個總體的概念,所以最后有了這種總結(jié)圖。前面幾篇文章主要講的就是上圖中AbstractExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor這三個類的主要功能,因?yàn)樗鼈兪蔷€程池真正的實(shí)現(xiàn)者

 

兩個接口

接下來詳細(xì)解釋下上圖出現(xiàn)的類和接口,首先是最頂層的接口Executor,它只定義了一個方法execute(Runnable command),相當(dāng)于定義了一個框架,它能夠執(zhí)行一個任務(wù)。Executor就像是定義了一個框架,并確定了這個框架能夠提供的功能。

第二個是ExecutorService接口,它繼承Executor。主要擴(kuò)展了關(guān)閉線程管理的一些功能,比如shutdown方法用來關(guān)閉線程池的任務(wù),isTerminated方法來判斷線程池的任務(wù)是否結(jié)束。

ExecutorService還提供了最重要的方法submit,它支持了有返回結(jié)果的任務(wù)提交,也引入了實(shí)現(xiàn)這個功能最關(guān)鍵的接口Callable、Future;

Executor、ExecutorService都是接口,只是定義了提交任務(wù)、關(guān)閉任務(wù)等方法,相當(dāng)于只是申明了線程池支持這些功能

AbstractExecutorService

AbstractExecutorService是線程池系列第三個類,它是抽象類并繼承ExecutorService接口。它主要是實(shí)現(xiàn)了ExecutorService接口的submit系列方法。

實(shí)現(xiàn)submit方法主要依靠RunnableFuture接口和它的實(shí)現(xiàn)類FutureTask。RunnableFuture繼承Runnable和Future接口,而它的實(shí)現(xiàn)FutureTask的一個屬性callable是Callable類型。

FutureTask實(shí)現(xiàn)了Runnable的run方法,run方法調(diào)用的是callable的call方法保存執(zhí)行結(jié)果。同時(shí)也實(shí)現(xiàn)Future的get方法獲取結(jié)果,如果任務(wù)還沒有執(zhí)行則阻塞線程

所以submit方法實(shí)現(xiàn)的主要過程是提交的任務(wù)Callable封裝成FutureTask,并把FutureTask當(dāng)作Runnable丟給execute方法去異步執(zhí)行,然后把FutureTask當(dāng)作Future作為submit返回值

但是AbstractExecutorService并沒有實(shí)現(xiàn)execute方法,所以它是一個抽象類,在等待有緣人來實(shí)現(xiàn)execute,實(shí)現(xiàn)線程池的最后一步。

實(shí)現(xiàn)正真的實(shí)現(xiàn)者ThreadPoolExecutor

ThreadPoolExecutor是Executor框架的正真實(shí)現(xiàn)者。它實(shí)現(xiàn)了execute方法,execute正真的實(shí)現(xiàn),以下三個關(guān)鍵點(diǎn):

HashSet<Worker> workers;//Worker集合,線程池

BlockingQueue<Runnable> workQueue;//阻塞隊(duì)列,要執(zhí)行的任務(wù)

final void runWorker(Worker w);//Worker調(diào)用這個方法,可以從阻塞隊(duì)列中獲取任務(wù)來執(zhí)行。

這里有一個關(guān)鍵類Worker,關(guān)鍵源碼如下:

一文總結(jié)線程池框架結(jié)構(gòu)體系

 

線程池execute方法會先根據(jù)現(xiàn)在Worker的數(shù)量判斷是創(chuàng)建一個Worker對象還是把任務(wù)直接放到隊(duì)列中,如果新建了Worker,則在最后會調(diào)用Worker的thread的start方法,start方法會異步執(zhí)行,execute方法就完成了。

start會執(zhí)行thread的run方法也就會執(zhí)行Worker的run方法,所以最終會執(zhí)行線程池的runWorker方法,runWorker會優(yōu)先執(zhí)行Worker中保存的任務(wù),如果為null則會從隊(duì)列中獲取任務(wù)再次執(zhí)行,獲取不到就阻塞。這里是一個死循環(huán),能拿到任務(wù)就執(zhí)行,執(zhí)行完就再去拿,拿不到就先阻塞

延遲隊(duì)列

ScheduledExecutorService繼承AbstractExecutorService,它申明了幾個schedule開頭的方法。

而ScheduledThreadPoolExecutor是ScheduledExecutorService的具體實(shí)現(xiàn),通過延遲隊(duì)列線程池實(shí)現(xiàn)了定期執(zhí)行任務(wù)的功能。

總結(jié)

線程池一直覺得是很復(fù)雜的功能,但是分析了它主要的方法的實(shí)現(xiàn)后就會發(fā)現(xiàn)還是比較簡單的,不過它的實(shí)現(xiàn)方式仍然是非常經(jīng)典巧妙的。

 

JAVA程序員日常學(xué)習(xí)筆記,如理解有誤歡迎各位交流討論!

分享到:
標(biāo)簽:線程 框架
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定