使用線程池的好處
降低資源消耗,提高響應速度,提高線程的可管理性
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對象)

主線程首先要創(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:此策將丟棄最早的未處理的任務請求。