Java多线程面试准备:聊聊Executor框架
點(diǎn)擊上方“好好學(xué)java”,選擇“置頂公眾號”
優(yōu)秀學(xué)習(xí)資源、干貨第一時(shí)間送達(dá)!
?精彩內(nèi)容?
java實(shí)戰(zhàn)練習(xí)項(xiàng)目教程
2018微服務(wù)資源springboot、springcloud、docker、dubbo實(shí)戰(zhàn)等傾心分享
2018年java架構(gòu)師全套學(xué)習(xí)教程
最新大數(shù)據(jù)培訓(xùn)完整視頻教程
2018年java最新全套培訓(xùn)學(xué)習(xí)教程
Executor框架的兩級調(diào)度模型
在HotSpot VM的線程模型中,Java線程被一對一映射為本地操作系統(tǒng)線程。Java線程啟動(dòng)時(shí)會創(chuàng)建一個(gè)本地操作系統(tǒng)線程;當(dāng)Java線程終止時(shí),這個(gè)操作系統(tǒng)線程也會被回收。操作系統(tǒng)會調(diào)用所有線程并將他們分配給可用的CPU。
可以將此種模式分為兩層,在上層,Java多線程程序通常把應(yīng)用程序分解為若干任務(wù),然后使用用戶級的調(diào)度器(Executor框架)將這些任務(wù)映射為固定數(shù)量的線程;在底層,操作系統(tǒng)內(nèi)核將這些線程映射到硬件處理器上。
兩級調(diào)度模型的示意圖:
imageExecutor框架的結(jié)構(gòu)
Executor框架主要由3大部分組成:
任務(wù): 包括被執(zhí)行的任務(wù)需要實(shí)現(xiàn)的接口:Runable 接口、Callable接口;
任務(wù)的執(zhí)行: 包括任務(wù)執(zhí)行機(jī)制的核心接口Executor,以及繼承自Executor的ExecutorService接口。Executor框架有兩個(gè)關(guān)鍵類實(shí)現(xiàn)了ExecutorService接口:ThreadPoolExecutor 和 ScheduledThreadPoolExecutor、ForkJoinPool;
任務(wù)的異步計(jì)算結(jié)果: 包括Future接口和實(shí)現(xiàn)Future接口的FutureTask類、ForkJoinTask類。
框架的類與接口:
image注意一下: 此圖不完整,Executor框架的成員還包括: CompletionService、ExecutorCompletionService 、ForkJoinTask、ForkJoinPool;
Executor框架的成員介紹
1、Runnable接口 和 Callable接口
Runnable接口和Callable接口的實(shí)現(xiàn)類,都可以被ThreadPoolExecutor或Scheduled-
ThreadPoolExecutor執(zhí)行。它們之間的區(qū)別是Runnable不會返回結(jié)果,而Callable可以返回結(jié)
果。
除了可以自己創(chuàng)建實(shí)現(xiàn)Callable接口的對象外,還可以使用工廠類Executors來把一個(gè)
Runnable包裝成一個(gè)Callable。
2、Executor、ExecutorService、AbstractExecutorService、ScheduledExecutorService
Executor 接口: 是Executor框架的基礎(chǔ),它將任務(wù)的提交與任務(wù)的執(zhí)行分離開來。
ExecutorService 接口: 擴(kuò)展了Executor接口,提供了管理終止的方法(shutdown( ) ,etc),以及可為跟蹤一個(gè)或多個(gè)異步任務(wù)執(zhí)行狀況而生成 Future 的方法。
AbstractExecutorService 類: 提供 ExecutorService 執(zhí)行方法的默認(rèn)實(shí)現(xiàn)。
ScheduledExecutorService 接口: 一個(gè)特殊的 ExecutorService,提供了 可安排在給定的延遲后運(yùn)行或定期執(zhí)行的命令。
3、ThreadPoolExecutor
ThreadPoolExecutor通常使用工廠類Executors來創(chuàng)建。Executors可以創(chuàng)建3種類型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadPool和CachedThreadPool。
以下是這三種線程池的應(yīng)用場景說明:
FixedThreadPool適用于為了滿足資源管理的需求,而需要限制當(dāng)前線程數(shù)量的應(yīng)用場
景,它適用于負(fù)載比較重的服務(wù)器。SingleThreadExecutor適用于需要保證順序地執(zhí)行各個(gè)任務(wù);并且在任意時(shí)間點(diǎn),不會有多
個(gè)線程是活動(dòng)的應(yīng)用場景。CachedThreadPool是大小無界的線程池,適用于執(zhí)行很多的短期異步任務(wù)的小程序,或者
是負(fù)載較輕的服務(wù)器4、ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor通常使用工廠類Executors來創(chuàng)建。Executors可以創(chuàng)建2種類
? ?型的ScheduledThreadPoolExecutor,如下。
ScheduledThreadPoolExecutor:包含若干個(gè)線程的ScheduledThreadPoolExecutor。
SingleThreadScheduledExecutor:只包含一個(gè)線程的ScheduledThreadPoolExecutor。
5、Future 接口
Future接口和實(shí)現(xiàn)Future接口的FutureTask類用來表示異步計(jì)算的結(jié)果。當(dāng)我們把Runnable
接口或Callable接口的實(shí)現(xiàn)類提交(submit)給ThreadPoolExecutor或
ScheduledThreadPoolExecutor時(shí),ThreadPoolExecutor或ScheduledThreadPoolExecutor會向我們
返回一個(gè)FutureTask對象。下面是對應(yīng)的API。
有一點(diǎn)需要讀者注意,到目前最新的JDK 8為止,Java通過上述API返回的是一個(gè)
FutureTask對象。但從API可以看到,Java僅僅保證返回的是一個(gè)實(shí)現(xiàn)了Future接口的對象。在將
來的JDK實(shí)現(xiàn)中,返回的可能不一定是FutureTask
推薦閱讀
1.?每日都見到的springboot日志
2.?springmvc入門
3.?servlet就是這么簡單
4.?重溫javaweb過濾器filter
附上熱門QQ群,存放資源和歷史資料,2000容量(低門檻付費(fèi)群),長按二維碼入群
總結(jié)
以上是生活随笔為你收集整理的Java多线程面试准备:聊聊Executor框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java大公司后端多线程面试题最强分享
- 下一篇: java美元兑换,(Java实现) 美元