Java線程池的學習筆記

使用線程池的好處

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

Executor框架簡介

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

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

Executor框架結構(主要由三大部分組成)

任務(Runnable/Callable)

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

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

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

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

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


類描述

3)異步計算的結果(Future)

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

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


Executor框架使用

主線程首先要創(chuàng)建Runnable或者Callable接口的任務對象。

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

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

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

ThreadPoolExecutor類簡單介紹

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

ThreadPoolExecutor類構造方法

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

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

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

TimeUnit?時間單位

BlockingQueue<Runnable> workQueue任務隊列,用來存儲等待執(zhí)行任務的隊列

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

RejectedExecutionHandler?拒絕策略,當提交的任務過多的時候,我們定制策略來處理

ThreadPoolExecutor飽和策略定義:

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

AbortPolicy拋出RejectedExecutionException來拒絕新任務的處理。

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

DiscardPlolicy:不處理新任務,直接丟棄掉。

DiscardOldestPolicy:此策將丟棄最早的未處理的任務請求。

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

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

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