前言前端
線程池是Java面試必問問題之一!面試
有沒有對源碼倒背如流的童鞋?請舉手! ♂️(怎麼沒人舉手。。)ide
對了,今天先來撒一波狗狼~函數
(表打我~)工具
來,介紹下:學習
她叫碼妞,是我碼仔的女友喔!動畫
她也在學習各種前端技術,可厲害了!線程
你們鼓掌歡迎吧!之後她會常常來問我問題的,要被煩了~3d
最近碼妞也在看Java線程池呢,已經看得一頭霧水了,正準備去問問碼仔,blog
看碼仔能不能給她講明白了!
線程
線程是一種資源,並非只存在程序的世界裏。
程序,原本就是對生活的一種抽象表述。
好比像車站的售票窗口、退票窗口、檢票窗口,每一個窗口都在作不一樣的事情,就是車站裏同時運行着的不一樣線程。
線程多了,須要管理,不一樣的線程也要能保證不會互相干擾,各作各的。
線程的生命週期
這個圖很熟悉的吧~
好,開始講線程池啦~
ThreadPoolExecutor
線程池源碼裏最主要的類了~
看下開頭的這段註釋:
看到英文就頭暈?沒事啦~
主要講線程池重要的兩個狀態:
線程池用一個32位的int來同時保存runState和workerCount,其中高3位(第31到29位)是runState,其他29位是workerCount(大約500 million)。
來看看存儲結構(碼仔手動畫的哦)
它的構造方法
核心線程數,比如班幹部的人數。
最大線程數,比如教室裏的座位數。 當提交任務數超過了這個最大值,線程還有拒絕策略——RejectExecutionHandler,作不動了嘛。
除核心線程外的空閒線程保持存活時間。 當線程池裏線程數超過corePoolSize數量了,keepAliveTime時間到,就把空閒線程關了,否則也閒置了呀,節省能量嘛。
Worker來了!
你看Worker的定義,其實它就是封裝了的工做線程~
Worker既實現了Runnable,又繼承了AbstractQueuedSynchronizer(AQS),因此它既是一個可執行的任務,又能夠達到鎖的效果。
看看Worker構造方法:
線程池是怎麼工做的?
DuangDuangDuang!
看execute方法裏的註釋,一步步說得很清楚。
給你流程圖!
工具類 Executors
線程池裏還有個重要的類:Executors~
Executors是一個Java中的工具類,它提供工廠方法來建立不一樣類型的線程池。
用它能夠很方便地建立出下面幾種線程池來~
或者經過ThreadPoolExecutor的構造函數自定義須要的線程池。