Android中的線程池

線程池的優(yōu)點(diǎn):

1.重用線程池中的線程禽炬,避免因?yàn)榫€程的創(chuàng)建和銷毀所帶來(lái)的性能開銷。

2.能有效控制線程池的最大并發(fā)數(shù)栓霜,避免大量的線程之間因互相搶占系統(tǒng)資源而導(dǎo)致的阻塞現(xiàn)象瘟栖。

3.能夠?qū)€程進(jìn)行簡(jiǎn)單的管理,并提供定時(shí)執(zhí)行以及指定間隔循環(huán)執(zhí)行等功能蜡豹。

Android中線程池的概念來(lái)源于Java中的Executor麸粮,Executor是一個(gè)接口,真正的線程池的實(shí)現(xiàn)為ThreadPoolExecutor镜廉。ThreadPoolExecutor提供了一系列參數(shù)來(lái)配置線程池豹休,通過不同的參數(shù)可以創(chuàng)建不同的線程池。從功能上來(lái)說(shuō)桨吊,Android的線程池主要分為4類威根,這4類線程池可以通過Executors所提供的工廠方法來(lái)得到。

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory);

corePollSize: 線程池的核心線程數(shù)视乐,默認(rèn)情況下洛搀,核心線程會(huì)在線程池中一直存活,即使它們處于閑置狀態(tài)佑淀。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true留美,那么閑置的核心線程在等待新任務(wù)到來(lái)時(shí)會(huì)有超時(shí)策略,這個(gè)時(shí)間間隔有keepAliveTime所指定伸刃,當(dāng)?shù)却龝r(shí)間超過keepAliveTime所指定的時(shí)長(zhǎng)后谎砾,核心線程就會(huì)終止(也就是閑置超過這個(gè)時(shí)間會(huì)終止)。

maximumPoolSize:線程池所能容納的最大線程數(shù)捧颅,當(dāng)活動(dòng)線程數(shù)達(dá)到這個(gè)數(shù)值后景图,后續(xù)的新任務(wù)將會(huì)被阻塞。

keepAliveTime:非核心線程閑置時(shí)的超時(shí)時(shí)長(zhǎng)碉哑,超過這個(gè)時(shí)長(zhǎng)挚币,非核心線程就會(huì)被回收。當(dāng)ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true扣典,keepAliveTime也會(huì)作用于核心線程妆毕。

unit:用于指定keepAliveTime參數(shù)的時(shí)間單位,這是一個(gè)枚舉贮尖,常用的有TimeUnit.MILLISENCONDS(毫秒)笛粘,TimeUnit.SECONDS(秒)以及TimeUnit.MINUTES(分鐘)等。

workQueue:線程池的任務(wù)隊(duì)列,通過線程池的execute方法提交的Runnable對(duì)象會(huì)存儲(chǔ)在這個(gè)參數(shù)中薪前。

threadFactory:線程工廠润努,為線程池提供創(chuàng)建新線程的功能。ThreadFactory是一個(gè)接口序六,它只有一個(gè)方法:Thread newThread(Runnable r)。

出了上面這些主要的參數(shù)外蚤吹,ThreadPoolExecutor還有一個(gè)不常用的參數(shù)RejectedExecutionHandler handler例诀。當(dāng)線程池?zé)o法執(zhí)行新任務(wù)時(shí),這可能是由于任務(wù)隊(duì)列已滿或者是無(wú)法成功執(zhí)行任務(wù)裁着,這個(gè)時(shí)候ThreadPoolExecutor會(huì)調(diào)用handler的rejectedExecution方法來(lái)通知調(diào)用者繁涂,默認(rèn)情況下rejectedExecution方法會(huì)直接拋出RejectedExecutionException異常。ThreadPoolExecutor為RejectedExecutionHandler提供了幾個(gè)可選值二驰,其中AbortPolicy是默認(rèn)值扔罪,它會(huì)直接拋出RejectedExecutionException。

ThreadPoolExecutor執(zhí)行任務(wù)時(shí)大致遵循以下規(guī)則:

(1)如果線程池中的線程數(shù)量未達(dá)到核心線程的數(shù)量桶雀,那么會(huì)直接啟動(dòng)一個(gè)核心線程來(lái)執(zhí)行任務(wù)矿酵。

(2)如果線程池中的線程數(shù)量已經(jīng)達(dá)到或者超過核心線程的數(shù)量,那么任務(wù)會(huì)被插入到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行矗积。

(3)如果在步驟2中無(wú)法將任務(wù)插入到任務(wù)隊(duì)列中全肮,這往往是由于任務(wù)隊(duì)列已滿,這個(gè)時(shí)候如果線程數(shù)量未達(dá)到線程池規(guī)定的最大值棘捣,那么會(huì)立刻啟動(dòng)一個(gè)非核心線程來(lái)執(zhí)行任務(wù)辜腺。

(4)如果和步驟3中線程數(shù)量已經(jīng)達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務(wù)乍恐,ThreadPoolExecutor會(huì)調(diào)用RejectedExecutionHandler的RejectedExecution方法來(lái)通知調(diào)用者评疗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茵烈,隨后出現(xiàn)的幾起案子百匆,更是在濱河造成了極大的恐慌,老刑警劉巖呜投,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧华,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宙彪,警方通過查閱死者的電腦和手機(jī)矩动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)释漆,“玉大人悲没,你說(shuō)我怎么就攤上這事。” “怎么了示姿?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵甜橱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我栈戳,道長(zhǎng)岂傲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任子檀,我火速辦了婚禮镊掖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褂痰。我一直安慰自己亩进,他們只是感情好涂佃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布抬吟。 她就那樣靜靜地躺著,像睡著了一般焚刺。 火紅的嫁衣襯著肌膚如雪匪蝙。 梳的紋絲不亂的頭發(fā)上主籍,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音逛球,去河邊找鬼崇猫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛需忿,可吹牛的內(nèi)容都是我干的诅炉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屋厘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涕烧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起汗洒,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤议纯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溢谤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞻凤,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年世杀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阀参。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞻坝,死狀恐怖蛛壳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤衙荐,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布捞挥,位于F島的核電站,受9級(jí)特大地震影響忧吟,放射性物質(zhì)發(fā)生泄漏砌函。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一溜族、第九天 我趴在偏房一處隱蔽的房頂上張望讹俊。 院中可真熱鬧,春花似錦斩祭、人聲如沸劣像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绑青,卻和暖如春诬像,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闸婴。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工坏挠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邪乍。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓降狠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親庇楞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榜配,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 線程池的優(yōu)點(diǎn): 重用線程池中的線程,避免因?yàn)榫€程的創(chuàng)建和銷毀帶來(lái)的性能消耗 能有效的控制線程的最大并發(fā)數(shù)吕晌,避免大量...
    乆丩乣閱讀 5,389評(píng)論 5 30
  • 線程池的好處 (1)重用線程池中的線程蛋褥,避免因?yàn)榫€程的創(chuàng)建和銷毀所帶來(lái)的性能的開銷。(2)能有效控制線程池的最大并...
    藍(lán)楓zeke閱讀 354評(píng)論 0 2
  • Android 中的四種線程池 在開發(fā)中使用線程池的優(yōu)點(diǎn) 重用線程池中的線程睛驳,避免因?yàn)榫€程的創(chuàng)建和銷毀帶來(lái)的性能開...
    任教主來(lái)也閱讀 184評(píng)論 0 0
  • 前段時(shí)間遇到這樣一個(gè)問題烙心,有人問微信朋友圈的上傳圖片的功能怎么做才能讓用戶的等待時(shí)間較短,比如說(shuō)一下上傳9張圖片,...
    加油碼農(nóng)閱讀 1,203評(píng)論 0 2
  • 星月starmoon閱讀 684評(píng)論 0 0