ava(Android)線程池

介紹new Thread的弊端及Java四種線程池的使用,對Android同樣適用宵蕉。本文是基礎(chǔ)篇酝静,后面會分享下線程池一些高級功能。

1羡玛、new Thread的弊端

執(zhí)行一個異步任務(wù)你還只是如下new Thread嗎别智?

newThread(newRunnable(){

@Override

publicvoidrun(){

// TODO Auto-generated method stub

}

}).start();

那你就out太多了,new Thread的弊端如下:

a. 每次new Thread新建對象性能差稼稿。

b. 線程缺乏統(tǒng)一管理薄榛,可能無限制新建線程,相互之間競爭让歼,及可能占用過多系統(tǒng)資源導(dǎo)致死機(jī)或oom敞恋。

c. 缺乏更多功能,如定時執(zhí)行谋右、定期執(zhí)行硬猫、線程中斷。

相比new Thread改执,Java提供的四種線程池的好處在于:

a. 重用存在的線程啸蜜,減少對象創(chuàng)建、消亡的開銷辈挂,性能佳衬横。

b. 可有效控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率终蒂,同時避免過多資源競爭蜂林,避免堵塞。

c. 提供定時執(zhí)行后豫、定期執(zhí)行悉尾、單線程突那、并發(fā)數(shù)控制等功能挫酿。

2、Java 線程池

Java通過Executors提供四種線程池愕难,分別為:

newCachedThreadPool創(chuàng)建一個可緩存線程池早龟,如果線程池長度超過處理需要,可靈活回收空閑線程猫缭,若無可回收葱弟,則新建線程。

newFixedThreadPool 創(chuàng)建一個定長線程池猜丹,可控制線程最大并發(fā)數(shù)芝加,超出的線程會在隊列中等待。

newScheduledThreadPool 創(chuàng)建一個定長線程池射窒,支持定時及周期性任務(wù)執(zhí)行藏杖。

newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池将塑,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行蝌麸。

(1). newCachedThreadPool

創(chuàng)建一個可緩存線程池点寥,如果線程池長度超過處理需要,可靈活回收空閑線程来吩,若無可回收敢辩,則新建線程。示例代碼如下:

ExecutorServicecachedThreadPool=Executors.newCachedThreadPool();

for(inti=0;i<10;i++){

finalintindex=i;

try{

Thread.sleep(index*1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

cachedThreadPool.execute(newRunnable(){

@Override

publicvoidrun(){

System.out.println(index);

}

});

}

線程池為無限大弟疆,當(dāng)執(zhí)行第二個任務(wù)時第一個任務(wù)已經(jīng)完成戚长,會復(fù)用執(zhí)行第一個任務(wù)的線程,而不用每次新建線程兽间。

(2). newFixedThreadPool

創(chuàng)建一個定長線程池历葛,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待嘀略。示例代碼如下:

ExecutorServicefixedThreadPool=Executors.newFixedThreadPool(3);

for(inti=0;i<10;i++){

finalintindex=i;

fixedThreadPool.execute(newRunnable(){

@Override

publicvoidrun(){

try{

System.out.println(index);

Thread.sleep(2000);

}catch(InterruptedExceptione){

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

因為線程池大小為3恤溶,每個任務(wù)輸出index后sleep 2秒,所以每兩秒打印3個數(shù)字帜羊。

定長線程池的大小最好根據(jù)系統(tǒng)資源進(jìn)行設(shè)置咒程。如Runtime.getRuntime().availableProcessors()∷嫌可參考PreloadDataCache帐姻。

(3) newScheduledThreadPool

創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行奶段。延遲執(zhí)行示例代碼如下:

ScheduledExecutorServicescheduledThreadPool=Executors.newScheduledThreadPool(5);

scheduledThreadPool.schedule(newRunnable(){

@Override

publicvoidrun(){

System.out.println("delay 3 seconds");

}

},3,TimeUnit.SECONDS);

表示延遲3秒執(zhí)行饥瓷。

定期執(zhí)行示例代碼如下:

scheduledThreadPool.scheduleAtFixedRate(newRunnable(){

@Override

publicvoidrun(){

System.out.println("delay 1 seconds, and excute every 3 seconds");

}

},1,3,TimeUnit.SECONDS);

表示延遲1秒后每3秒執(zhí)行一次。

ScheduledExecutorService比Timer更安全痹籍,功能更強(qiáng)大呢铆,后面會有一篇單獨(dú)進(jìn)行對比。

(4)蹲缠、newSingleThreadExecutor

創(chuàng)建一個單線程化的線程池棺克,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行线定。示例代碼如下:

ExecutorServicesingleThreadExecutor=Executors.newSingleThreadExecutor();

for(inti=0;i<10;i++){

finalintindex=i;

singleThreadExecutor.execute(newRunnable(){

@Override

publicvoidrun(){

try{

System.out.println(index);

Thread.sleep(2000);

}catch(InterruptedExceptione){

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

結(jié)果依次輸出娜谊,相當(dāng)于順序執(zhí)行各個任務(wù)。

現(xiàn)行大多數(shù)GUI程序都是單線程的斤讥。Android中單線程可用于數(shù)據(jù)庫操作纱皆,文件操作,應(yīng)用批量安裝,應(yīng)用批量刪除等不適合并發(fā)但可能IO阻塞性及影響UI線程響應(yīng)的操作派草。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撑帖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澳眷,更是在濱河造成了極大的恐慌胡嘿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳踊,死亡現(xiàn)場離奇詭異衷敌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拓瞪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門缴罗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祭埂,你說我怎么就攤上這事面氓。” “怎么了蛆橡?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵舌界,是天一觀的道長。 經(jīng)常有香客問我泰演,道長呻拌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任睦焕,我火速辦了婚禮藐握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垃喊。我一直安慰自己猾普,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布本谜。 她就那樣靜靜地躺著初家,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕突。 梳的紋絲不亂的頭發(fā)上笤成,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天评架,我揣著相機(jī)與錄音眷茁,去河邊找鬼。 笑死纵诞,一個胖子當(dāng)著我的面吹牛上祈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼登刺,長吁一口氣:“原來是場噩夢啊……” “哼籽腕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纸俭,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤皇耗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揍很,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郎楼,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年窒悔,在試婚紗的時候發(fā)現(xiàn)自己被綠了呜袁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡简珠,死狀恐怖阶界,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聋庵,我是刑警寧澤膘融,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站祭玉,受9級特大地震影響托启,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攘宙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一屯耸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹭劈,春花似錦疗绣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哈打,卻和暖如春塔逃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背料仗。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工湾盗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立轧。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓格粪,卻偏偏與公主長得像躏吊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帐萎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

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

  • 1比伏、new Thread的弊端 執(zhí)行一個異步任務(wù)你還只是如下new Thread嗎? ``` new Thread...
    Jannonx閱讀 2,758評論 0 6
  • 前段時間遇到這樣一個問題疆导,有人問微信朋友圈的上傳圖片的功能怎么做才能讓用戶的等待時間較短赁项,比如說一下上傳9張圖片,...
    加油碼農(nóng)閱讀 1,190評論 0 2
  • 目前的工作是接觸大數(shù)據(jù)相關(guān)的內(nèi)容,自己也缺少高并發(fā)的知識澈段,剛好前幾天看了flume的源碼肤舞,里面也用到了各種線程池內(nèi)...
    等一夏_81f7閱讀 1,392評論 0 0
  • Java通過Executors提供四種線程池,分別為: newCachedThreadPool創(chuàng)建一個可緩存線程池...
    lucky_yaya閱讀 293評論 0 0
  • “回首向來蕭瑟處均蜜,歸去李剖,也無風(fēng)雨也無晴” 一路走來,經(jīng)歷的艱辛囤耳、坎坷都隨風(fēng)而逝篙顺。人生本來就不是一帆風(fēng)順的過程,你昨...
    涼白開加冰閱讀 230評論 0 1