目錄
- Executor
- ThreadPoolExecutor
- Executors
- execute vs submit
- 總結(jié)
1. Executor
Executor 是一個核心接口济丘,真正線程池的實現(xiàn)是 ThreadPoolExecutor 類啊胶。注意 Executor(接口) -> ExecutorService(接口) -> AbstractExecutorService -> ThreadPoolExecutor 這條繼承關(guān)系線
2. ThreadPoolExecutor
ThreadPoolExecutor 的構(gòu)造方法包含如下參數(shù):
- corePoolSize:線程池的核心線程數(shù),默認(rèn)核心線程會在線程池中一直存活
- maximumPoolSize:線程池所能容納的最大線程數(shù)
- keepAliveTime:非核心線程的閑置時間甫贯,超過該時長非核心線程就會被回收堪遂。若設(shè)置 ThreadPoolExecutor 的 allowCoreThreadTimeOut 屬性為 true贴彼,則 keepAliveTime 也會作用于核心線程
- unit:keepAliveTime 參數(shù)的時間單位搔课,是一個名字為 TimeUnit 的枚舉
- workQueue:線程池中的任務(wù)隊列
- threadFactory:為線程池提供創(chuàng)建新線程的線程工廠類
ThreadPoolExecutor 執(zhí)行任務(wù)的大致步驟:
- 若線程池中的線程數(shù)量未達(dá)到核心線程數(shù),則直接啟動一個核心線程來執(zhí)行任務(wù)
- 若線程數(shù)量已經(jīng)達(dá)到了核心線程的數(shù)量遂铡,則任務(wù)被插入任務(wù)隊列中進(jìn)行等待
- 若任務(wù)隊列已滿且線程數(shù)未達(dá)到規(guī)定的最大值肮疗,則啟動一個非核心線程來執(zhí)行任務(wù)
- 若啟動的線程數(shù)也已經(jīng)到達(dá)了最大值,則拒絕執(zhí)行此任務(wù)扒接,調(diào)用 RejectedExecutionHandler 的 rejectedExecution() 方法通知調(diào)用者
3. Executors
Executors 提供了一系列工廠方法用于創(chuàng)建線程池伪货,返回的線程池都實現(xiàn)了 ExecutorService 接口(注意 ExecutorService 的具體實現(xiàn)者是 ThreadPoolExecutor 類)。線程池的分類如下:
- FixedThreadPool:線程池中只有核心線程并且這些線程沒有超時限制珠增,任務(wù)隊列也沒有大小限制
- CachedThreadPool:只有非核心線程超歌,空閑線程的超時時長為 60 秒,它的任務(wù)隊列是一個無法插入元素的特殊隊列蒂教,也就意味著到來的任務(wù)會被立即執(zhí)行
- ScheduledThreadPool:核心線程數(shù)量固定巍举,非核心線程數(shù)量沒有限制,非核心線程閑置時會被立即回收凝垛,主要用于執(zhí)行定時任務(wù)和重復(fù)任務(wù)
- SingleThreadExecutor:只有一個核心線程懊悯,它確保每個任務(wù)都在同一個線程中執(zhí)行蜓谋,因而不需要處理線程間的同步問題
4. execute vs submit
- 線程池執(zhí)行任務(wù)時,可以掉用 Executor 定義的 execute() 方法提交 Runnable 任務(wù)炭分,也可以調(diào)用 ExecutorService 定義的 submit() 方法提交 Callable 任務(wù)
- 區(qū)別在于后者會返回一個 Future 對象桃焕,通過 Future 對象可以方便的取消任務(wù)的執(zhí)行或者獲取任務(wù)的當(dāng)前狀態(tài)等
5. 總結(jié)
- Executor 框架包括:Executor,ExecutorService捧毛,ThreadPoolExecutor观堂,Executors
- Executor 是一個核心接口,定義了一個方法 execute(r)
- ExecutorService 接口繼承自 Executor 接口呀忧,它有兩個提交任務(wù)的方法 execute() 和 submit()
- Executors 提供了一系列工廠方法用于創(chuàng)建線程池师痕,返回的線程池都實現(xiàn)了 ExecutorService 接口
- 可以用 Executor 定義的 execute() 方法提交 Runnable 任務(wù),也可以用 ExecutorService 定義的 submit() 方法提交 Callable 任務(wù)而账,后者會返回一個 Future 對象胰坟,通過 它可以方便的取消任務(wù)的執(zhí)行或獲取任務(wù)的當(dāng)前狀態(tài)等