Java線程池的學(xué)習(xí)筆記

使用線程池的好處

降低資源消耗,提高響應(yīng)速度,提高線程的可管理性

Executor框架簡(jiǎn)介

Executor框架是Java5之后引進(jìn)的,在Java5之后通過Executor來啟動(dòng)線程比使用Thread的start方法更好,使用線程池,節(jié)約開銷,有助于避免this逃逸問題。

Executor框架不僅包括線程池的管理,還提供線程工廠、隊(duì)列以及拒絕策略等,Executor框架讓并發(fā)編程變得更加簡(jiǎn)單。

Executor框架結(jié)構(gòu)(主要由三大部分組成)

任務(wù)(Runnable/Callable)

執(zhí)行任務(wù)需要實(shí)現(xiàn)的Runnable接口或Callable接口。Runnable接口或Callable接口實(shí)現(xiàn)類可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor執(zhí)行。

任務(wù)的執(zhí)行(Executor)

任務(wù)執(zhí)行的核心接口Executor,以及繼承字Executor接口的ExecutorService接口。ThreadPoolExecutor和ScheduledThreadPoolExecutor這兩個(gè)關(guān)鍵類實(shí)現(xiàn)了ExecutorService接口。

ThreadPoolExecutor這個(gè)類在我們實(shí)際使用線程池的過程中,使用頻繁非常高。

通過查看ScheduledThreadPoolExecutor線程池的源碼我們發(fā)現(xiàn)ScheduledThreadPoolExcutor實(shí)際上是繼承了ThreadPoolExecutor并實(shí)現(xiàn)了ScheduledExecutorService,而ScheduledExecutorService又實(shí)現(xiàn)了ExecutorService


類描述

3)異步計(jì)算的結(jié)果(Future)

Future接口以及Future接口的實(shí)現(xiàn)類FutureTask類都可以代表異步計(jì)算的結(jié)果

當(dāng)我們把Runnable接口或Callable接口的實(shí)現(xiàn)類提交給ThreadPoolExecutor或ScheduledThreadPoolExecutor執(zhí)行。(調(diào)用submit()方法時(shí)會(huì)返回一個(gè)FutureTask對(duì)象)


Executor框架使用

主線程首先要?jiǎng)?chuàng)建Runnable或者Callable接口的任務(wù)對(duì)象。

把創(chuàng)建的實(shí)現(xiàn)Runnabe/Callable接口的對(duì)象直接交給ExecutorServic.execute方法,也可以把Runable對(duì)象或者Callable對(duì)象提交給ExecutorService.submit方法

如果執(zhí)行ExecutorService.submit(),ExecutorServicce將返回一個(gè)實(shí)現(xiàn)Future接口的對(duì)象,submit()我們可以創(chuàng)建FutureTask,然后直接交給ExecutorService執(zhí)行。

最后,主線程可以執(zhí)行FutureTask.get()方法來等待任務(wù)執(zhí)行完成。主線程可以執(zhí)行FutureTask.cancel()來取消此任務(wù)的執(zhí)行

ThreadPoolExecutor類簡(jiǎn)單介紹

線程池ThreadPoolExecutor是Executor框架最核心的類

ThreadPoolExecutor類構(gòu)造方法

int?corePoolSize?線程池的核心線程數(shù)

int?maximumPoolSize?線程池的最大線程數(shù)

long?keepAliveTime?當(dāng)線程數(shù)大于核心數(shù)時(shí),多余的空閑線程存活的最長(zhǎng)時(shí)間

TimeUnit?時(shí)間單位

BlockingQueue<Runnable> workQueue任務(wù)隊(duì)列,用來存儲(chǔ)等待執(zhí)行任務(wù)的隊(duì)列

ThreaFactory?threadFactory線程工廠,用來創(chuàng)建線程,一般默認(rèn)即可

RejectedExecutionHandler?拒絕策略,當(dāng)提交的任務(wù)過多的時(shí)候,我們定制策略來處理

ThreadPoolExecutor飽和策略定義:

如果當(dāng)前同時(shí)運(yùn)行的線程數(shù)量達(dá)到了最大線程數(shù)量并且隊(duì)列也被放滿了任務(wù)時(shí),ThreadPoolTaskExecutor定義了一些策略

AbortPolicy拋出RejectedExecutionException來拒絕新任務(wù)的處理。

ThreadPoolExecutor.CallerRunsPolicy:調(diào)用執(zhí)行自己的線程運(yùn)行任務(wù)。如果你的應(yīng)用程序可以承受此延遲并且你不能任務(wù)丟棄任何一個(gè)任務(wù)請(qǐng)求的話,你可以選擇這個(gè)策略

DiscardPlolicy:不處理新任務(wù),直接丟棄掉。

DiscardOldestPolicy:此策將丟棄最早的未處理的任務(wù)請(qǐng)求。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容