使用線程池的好處
降低資源消耗,提高響應(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ì)象)

主線程首先要?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)求。