線程池

目錄

  1. Executor
  2. ThreadPoolExecutor
  3. Executors
  4. execute vs submit
  5. 總結(jié)

1. Executor

Executor 是一個核心接口,真正線程池的實現(xiàn)是 ThreadPoolExecutor 類。注意 Executor(接口) -> ExecutorService(接口) -> AbstractExecutorService -> ThreadPoolExecutor 這條繼承關(guān)系線

2. ThreadPoolExecutor

ThreadPoolExecutor 的構(gòu)造方法包含如下參數(shù):

  • corePoolSize:線程池的核心線程數(shù),默認核心線程會在線程池中一直存活
  • maximumPoolSize:線程池所能容納的最大線程數(shù)
  • keepAliveTime:非核心線程的閑置時間,超過該時長非核心線程就會被回收。若設(shè)置 ThreadPoolExecutor 的 allowCoreThreadTimeOut 屬性為 true,則 keepAliveTime 也會作用于核心線程
  • unit:keepAliveTime 參數(shù)的時間單位,是一個名字為 TimeUnit 的枚舉
  • workQueue:線程池中的任務(wù)隊列
  • threadFactory:為線程池提供創(chuàng)建新線程的線程工廠類

ThreadPoolExecutor 執(zhí)行任務(wù)的大致步驟:

  • 若線程池中的線程數(shù)量未達到核心線程數(shù),則直接啟動一個核心線程來執(zhí)行任務(wù)
  • 若線程數(shù)量已經(jīng)達到了核心線程的數(shù)量,則任務(wù)被插入任務(wù)隊列中進行等待
  • 若任務(wù)隊列已滿且線程數(shù)未達到規(guī)定的最大值,則啟動一個非核心線程來執(zhí)行任務(wù)
  • 若啟動的線程數(shù)也已經(jīng)到達了最大值,則拒絕執(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ù)的當前狀態(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ù)的當前狀態(tài)等
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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