ThreadPoolExecutor

實際開發(fā)中需要開啟異步線程時攒庵,我們都會使用ThreadPoolExecutor類嘴纺。但是我們一般不會直接通過Executors來隨便定義出一個線程池,而是抽象一個utils單例的保存線程池對象供項目使用浓冒,根據業(yè)務不同栽渴,可能有多個。

private static ThreadPoolExecutor exec = new ThreadPoolExecutor(10, 30,
            300, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10000),
            Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());

這是一個線程池的配置稳懒,各個參數含義如下:
1闲擦、corePoolSize, 核心線程數,建議和cpu的核心數差不多场梆,當有任務提交墅冷,檢測當前線程池內的線程數小于corePoolSize的話,新建線程執(zhí)行任務或油,而不會開始復用寞忿,會新建,直到達到corePoolSize顶岸。線程池內的線程數大于等于corePoolSize時腔彰,將任務放入workQueue等待。

2辖佣、maximumPoolSize霹抛,允許線程池內最大線程數,當隊列滿了之后卷谈,如果線程池內的線程數小于maximumPoolSize新建線程杯拐,如果大于等于執(zhí)行拒絕策略。
如果maximumPoolSize是30,corePoolSize是10藕施,當隊列滿了后只能再開20個線程寇损。

3、keepAliveTime裳食,線程池空閑時矛市,線程存活的時間。

4诲祸、workQueue浊吏,上面提到的線程數超過corePoolSize存放任務的地方。

5救氯、threadFactory找田,線程工廠,可以自己重寫一下着憨,為每個線程賦予一個名字墩衙,便于排查問題。

6甲抖、handler漆改,拒絕策略,分4種准谚,AbortPolicy直接拋出異常挫剑、DiscardPolicy悄悄拋棄不執(zhí)行、CallerRunsPolicy(調用者運行):該策略既不會拋棄任務也不會拋出異常柱衔,而是將這個任務退回給調用者樊破,從而降低新任務的流量;唆铐、DiscardOldestPolicy(拋棄最舊的)


調用時我們會封裝個方法調用到exec.execute方法

    public void execute(Runnable task) {
        exec.execute(task);
    }

提交后大致的流程:
1哲戚、通過調用execute方法,調用ThreadPoolExecutor的addWork方法艾岂,Work類是對需要執(zhí)行的task的封裝惫恼,task保存在Work的firstTask變量中。execute方法中會做出將任務放在那里的判斷澳盐,如果進隊列,會將任務入隊令宿,并且addWord的task參數為null叼耙。
2、addWork方法中粒没,會初始化一個Work對象筛婉,構造方法中將任務傳入,賦值給firstTask變量,并從ThreadFactory中新建一個線程參數是this賦值給Work的thread變量爽撒。
3入蛆、然后后面調用Work中的thread變量的start方法,這樣調用到了Work的run方法硕勿。
4哨毁、work的run方法調用runWorker方法傳入this參數,方法內拿出work的firstTask賦值給task變量源武,如果為null,從隊列里面拿话浇,然后調用task的run方法執(zhí)行任務。

注意到在runwork中,task的run方法之前需要獲得鎖蹋订,為了防止線程池shutdown等操作中斷任務,所以加鎖。并且是不可重入鎖荠锭。Work類通過繼承AbstractQueuedSynchronizer實現的不可重入鎖证九。(可重入鎖的意思是在同一線程妈拌,再次獲取相同鎖資源不用獲取直接用猜惋,主要目的防止死鎖缓窜,synchronize和ReentrantLock都是可重入鎖。)

這里使用不可重入鎖的目的是防止beforeExecute等自定義方法調用setCorePoolSize方法進一步調用到interruptIdleWorkers里面的trylock獲取鎖成功導致自己將自己中斷

private void interruptIdleWorkers(boolean onlyOne) {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            for (Worker w : workers) {
                Thread t = w.thread;
                if (!t.isInterrupted() && w.tryLock()) {
                    try {
                        t.interrupt();
                    } catch (SecurityException ignore) {
                    } finally {
                        w.unlock();
                    }
                }
                if (onlyOne)
                    break;
            }
        } finally {
            mainLock.unlock();
        }
    }

t.interrupt();會將自己中斷掉港粱。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末偿曙,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子稿壁,更是在濱河造成了極大的恐慌歉备,老刑警劉巖傅是,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蕾羊,居然都是意外死亡喧笔,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門龟再,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溃斋,“玉大人,你說我怎么就攤上這事吸申。” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵截碴,是天一觀的道長梳侨。 經常有香客問我,道長日丹,這世上最難降的妖魔是什么走哺? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮哲虾,結果婚禮上丙躏,老公的妹妹穿的比我還像新娘。我一直安慰自己束凑,他們只是感情好晒旅,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汪诉,像睡著了一般废恋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扒寄,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天鱼鼓,我揣著相機與錄音,去河邊找鬼该编。 笑死迄本,一個胖子當著我的面吹牛,可吹牛的內容都是我干的课竣。 我是一名探鬼主播嘉赎,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稠氮!你這毒婦竟也來了曹阔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤隔披,失蹤者是張志新(化名)和其女友劉穎赃份,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體奢米,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抓韩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了鬓长。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒拴。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涉波,靈堂內的尸體忽然破棺而出英上,到底是詐尸還是另有隱情炭序,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布苍日,位于F島的核電站惭聂,受9級特大地震影響,放射性物質發(fā)生泄漏相恃。R本人自食惡果不足惜辜纲,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拦耐。 院中可真熱鬧耕腾,春花似錦、人聲如沸杀糯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火脉。三九已至牵舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倦挂,已是汗流浹背畸颅。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留方援,地道東北人没炒。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像犯戏,于是被迫代替她去往敵國和親送火。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容