線程池使用學(xué)習筆記

線程池的介紹

顧名思義線程池就是線程的池子,而這個池子它可以管理一個或多個線程,包括線程的創(chuàng)建以及使用炉爆,而身為Android開發(fā)至少對線程的使用還是多少了解的吧,畢竟Android建議我們將耗時操作放入到后臺線程去進行以及4.0以后強制我們只有在后臺線程中才能進行網(wǎng)絡(luò)訪問猪落,這樣就不會因為某些操作阻塞了UI線程中從而導(dǎo)致ANR(Android無響應(yīng))了。

線程池的使用

常見的線程池包括:

  • 單線程的線程池

  • 固定線程數(shù)的線程池

  • 動態(tài)線程數(shù)的的線程池

  • 自定義的線程池

接下來我就會從下面這些線程池入手分別介紹他們的使用和工作機制:
1.單線程的線程池
創(chuàng)建和使用單線程的線程池:
兩個方法可以獲取:ExecutorService newSingleThreadExecutor()
ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory )

//  創(chuàng)建單線程的線程池并執(zhí)行
ExecutorService threadPool = Executors.newSingleThreadExecutor();
threadPool.execute(new SlowTask("task0"));
threadPool.execute(new SlowTask("task1"));
threadPool.execute(new SlowTask("task2"));
//  要做的任務(wù)
private static class SlowTask implements Runnable {
    private String name;
    public SlowTask(String name) {
        this.name = name;
    }    
@Override    
public void run() {
        Log.i(TAG, "SlowTask " + name + " is running");
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                // 假裝很耗時
            }
        }
    }
    @Override
    public String toString() {
        return "SlowTask:" + name;
    }
}

單線程的線程池的工作機制:


單線程的線程池的工作機制.png

2.固定線程數(shù)的線程池:
兩個方法可以獲取:ExecutorService newFixedThreadPool(int threadCount)
ExecutorService newFixedThreadPool(int threadCount, ThreadFactory threadFactory )

//  創(chuàng)建一個固定5個線程數(shù)的線程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
    threadPool.execute(new SlowTask ("task" + i));
}

固定的線程池的工作機制:

固定線程數(shù)的線程池的工作機制.png

3.動態(tài)線程數(shù)的線程池:
兩個方法可以獲取:ExecutorService newCachedThreadPool()
ExecutorService newCachedThreadPool(ThreadFactory threadFactory )

//  創(chuàng)建動態(tài)線程數(shù)的線程池通過自定義一個ThreadFactory 
ExecutorService threadPool = Executors.newCachedThreadPool(5);
for (int i = 0; i < 10; i++) {
    threadPool.execute(new SlowTask ("task" + i));
}
//  自定義的線程工廠
private static class MyThreadFactory implements ThreadFactory {
    private static int count = 0;
    @Override
    public Thread newThread(Runnable r) {
        Log.i(TAG, "第 " + (count++) + " 個線程創(chuàng)建");
        return new Thread(r);
    }
}

動態(tài)線程數(shù)的線程池的工作機制:

動態(tài)線程數(shù)的線程池的工作機制.png

4.自定義的的線程池:
想要使用自定義線程池的時候我們需要使用到一個類——ThreadPoolExecutor畴博,其實我們在創(chuàng)建上面那三個線程池的時候都是Executors幫我們?nèi)ネㄟ^創(chuàng)建ThreadPoolExecutor來實現(xiàn)的笨忌,如圖:


Executors類的部分源碼.png

這個時候我們來看看ThreadPoolExecutor類的構(gòu)造函數(shù),當我們看構(gòu)造函數(shù)我們就知道傳哪些參數(shù)就可以幫我實現(xiàn)相同的效果或者他上面三個完全不同的效果,我們來看一個最長的構(gòu)造函數(shù):
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory ,
RejectedExecutionHandler handler)
那我就從上到下一個個來說明他們的含義:
1.corePoolSize:核心線程數(shù)
2.maximumPoolSize:核心線程數(shù)
3.keepAliveTime:空閑線程的存活時間
4.unit:空閑線程存活時間的單位
5.workQueue:任務(wù)等待隊列
6.threadFactory:線程工廠
7.handler:處理器, 當線程數(shù)已經(jīng)滿了, 也已經(jīng)沒有空閑線程了, 并且且任務(wù)等待隊列隊列也滿了, 接受不了任務(wù)了的時候就會把該任務(wù)交給handler進行處理俱病。
在了解了構(gòu)造器這些參數(shù)之后就可以很方便我們自定義線程池了(當然還有多個構(gòu)造函數(shù), 所以不一定使用這一個, 這是參數(shù)最多的構(gòu)造函數(shù)):

//  創(chuàng)建了一個核心線程數(shù)為2官疲,最大線程數(shù)為10的自定義線程
ExecutorService threadPool = new ThreadPoolExecutor(2, 10,
        60L, TimeUnit.SECONDS,
        new LinkedBlockingDeque<Runnable>(10),
        new MyThreadFactory(),
        new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                Log.i(TAG, "被拒任務(wù)名稱是: " + r.toString());
            }
        });
for (int i = 0; i < 20; i++) {
    try {
        threadPool.execute(new SlowTask("Task" + i));
    } catch (Exception e) {
        Log.e(TAG, e.toString());
    }
}
自定義線程池的工作機制:
自定義線程池的工作機制.png

5.關(guān)閉線程池
調(diào)用shutdown()或者調(diào)用shutdownNow()就可以了,可以通過isShutdown()判斷是否關(guān)閉.
shutdown()和shutdownNow()的區(qū)別如下圖:


shutdown()和shutdownNow()的區(qū)別.png

6.各個線程池的使用場景

各個線程池的使用場景(N為CPU數(shù)).png

線程池的實踐

我使用上述各類線程池寫了一個圖片預(yù)覽器, App截圖如下(手機截圖有點大):
選擇界面.png
下面獲取到的妹子圖片來自Gank.io, 如果是單線程的線程池圖片會一張一張顯示出來, 而固定線程我寫了3個亮隙,所以會三個三個顯示出來途凫,而動態(tài)線程數(shù)的線程池和自定義線程池都是會一口氣顯示很多
圖片展示界面.png
項目我已上傳Github, 地址為https://github.com/GzwJaaaelu/ThreadPoolExecutorDemo

Demo可能還有待完善的地方,請大家指出溢吻。

我希望可以站在初學(xué)者&自學(xué)者的角度把Android中的知識點很清楚的介紹給大家维费,希望大家喜歡。 如果有錯誤希望指出來煤裙,有問題或者沒看懂掩完,都可以來問我的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硼砰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欣硼,老刑警劉巖题翰,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡豹障,警方通過查閱死者的電腦和手機冯事,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來血公,“玉大人昵仅,你說我怎么就攤上這事±勰В” “怎么了摔笤?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垦写。 經(jīng)常有香客問我吕世,道長,這世上最難降的妖魔是什么梯投? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任命辖,我火速辦了婚禮,結(jié)果婚禮上分蓖,老公的妹妹穿的比我還像新娘尔艇。我一直安慰自己,他們只是感情好么鹤,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布终娃。 她就那樣靜靜地躺著,像睡著了一般午磁。 火紅的嫁衣襯著肌膚如雪尝抖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天迅皇,我揣著相機與錄音昧辽,去河邊找鬼。 笑死登颓,一個胖子當著我的面吹牛搅荞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播框咙,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咕痛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喇嘱?” 一聲冷哼從身側(cè)響起茉贡,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎者铜,沒想到半個月后腔丧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體放椰,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年愉粤,在試婚紗的時候發(fā)現(xiàn)自己被綠了砾医。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡衣厘,死狀恐怖如蚜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情影暴,我是刑警寧澤错邦,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站坤检,受9級特大地震影響兴猩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜早歇,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一倾芝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箭跳,春花似錦晨另、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屉来,卻和暖如春路翻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茄靠。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工茂契, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慨绳。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓掉冶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脐雪。 傳聞我的和親對象是個殘疾皇子厌小,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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