每日一面——談談你對線程池的理解(上)

菜雞每日一面系列打卡22

每天一道面試題目 

助力小夥伴輕鬆拿offer

堅持就是勝利,我們一起努力!

題目描述

談談你對線程池的理解(上)。

題目分析

終於寫到線程池了,同數據庫連接池一樣,線程池也是池化技術的一個經典應用。這裏面有很多設計技巧和細節,值得好好琢磨。當然,這些也是面試官考查的熱點問題。

鑑於線程池相關的內容非常之多,菜雞將其分爲上下兩篇,本文將主要講述線程池的概念,Java中的線程池以及線程池的生命週期。

題目解答

01

什麼是線程池

Brian Goetz在《Java併發編程實戰》一書中對線程池的論述一針見血,我們一起來欣賞一下。

線程池,從字面含義來看,是指管理一組同構工作線程的資源池。線程池是與工作隊列密切相關的,其中在工作隊列中保存了所有等待執行的任務。工作者線程的任務很簡單:從工作隊列中獲取一個任務,執行任務,然後返回線程池並等待下一個任務。

“在線程池中執行任務”“爲每個任務分配一個線程”優勢更多。通過重用現有的線程而不是創建新線程,可以在處理多個請求時分攤在線程創建和銷燬過程中產生的巨大開銷。另一個額外的好處是。當請求到達時,工作線程通常已經存在,因此不會由於等待創建線程而延遲任務的執行,從而提高了響應性。通過適當調整線程池的大小,可以創建足夠多的線程以便使處理器保持忙碌狀態,同時還可以防止過多線程相互競爭資源而使應用程序耗盡內存或失敗。

以上兩段話很概括地講了線程池的概念,基本原理和優勢。接下來,我們需要具體瞭解一下Java中的線程池。

02

Java中的線程池

在分析具體的線程池的實現之前,我們先通過一張圖,把握一下線程池相關類和接口的整體關係。

JDK對線程池提供了有效的支持。我們可以通過Executors類中的靜態工廠方法來創建線程池,下圖展示了常用的四種靜態工廠方法,我們將一一對其進行說明。

  • newFixedThreadPool:創建固定長度的線程池,每當提交一個任務就創建一個線程,直到達到線程池的最大數量後不再變化。

  • newSingleThreadExecutor:單線程的Executor,創建單個工作線程執行任務,可以確保按照任務在隊列中的順序來串行執行。

  • newCachedThreadPool:創建可緩存的線程池,如果線程池的當前規模超過處理需求時,回收空閒線程,反之,創建新的線程。

  • newScheduledThreadPool:創建固定長度的線程池,並且能以延遲或定時的方式執行任務。

03

Executor的生命週期

Executor接口極其簡單,但卻是一個非常重要的概念,它可以說是線程池體系的基礎,那麼,我們來研究一下它的一生。在學習Executor的生命週期的過程中,菜雞發現了《Java併發編程實戰》中文版中的一個失誤,書中稱,“爲了解決執行服務的生命週期問題,Executor擴展了ExecutorService接口”,事實上恰恰相反,菜雞認爲,“爲了解決執行服務的生命週期問題,ExecutorService擴展了Executor接口”。

ExecutorService的生命週期有3種狀態:運行、關閉和已終止。

  • 運行ExecutorService在創建之後處於運行狀態。

  • 關閉:調用shutdown方法進入關閉狀態(不再接受新任務,但已接受的任務包括未開始執行的任務會繼續執行);調用shutdownNow方法進入關閉狀態(嘗試取消所有運行中和尚未執行的任務)

  • 已終止ExecutorService關閉之後,在所有任務完成之後,進入終止狀態。

以上便是菜雞對線程池的總結上篇,供大家參考,下篇更精彩哦!

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章