更新時(shí)間:2017-07-02 來(lái)源:黑馬程序員Android+物聯(lián)網(wǎng)培訓(xùn)學(xué)院 瀏覽量:
cpu
資源
時(shí)間片
,系統(tǒng)通過(guò)一種循環(huán)的方式為線程提供時(shí)間片,線程在自己的時(shí)間內(nèi)運(yùn)行,因?yàn)闀r(shí)間相當(dāng)短,多個(gè)線程頻繁地發(fā)生切換,因此給用戶的感覺(jué)就是好像多個(gè)線程同時(shí)運(yùn)行一樣,但是如果計(jì)算機(jī)有多個(gè)CPU,線程就能真正意義上的同時(shí)運(yùn)行了.
減少頻繁的創(chuàng)建和銷毀對(duì)象。
提供了一些靜態(tài)方法,幫助我們方便的生成一些常用的線程池
,ThreadPoolExecutor是Executors類的底層實(shí)現(xiàn)//
構(gòu)造方法
public ThreadPoolExecutor(int corePoolSize
,
//
核心池的大小
int maximumPoolSize
,
//
線程池最大線程數(shù)
long keepAliveTime
,
//
保持時(shí)間
TimeUnit unit
,
//
時(shí)間單位
BlockingQueue<Runnable> workQueue
,
//
任務(wù)隊(duì)列
ThreadFactory threadFactory
,
//
線程工廠
RejectedExecutionHandler handler) //
異常的捕捉器
核心池的大小
,這個(gè)參數(shù)跟后面講述的線程池的實(shí)現(xiàn)原理有非常大的關(guān)系。在創(chuàng)建了線程池后,默認(rèn)情況下,線程池中并沒(méi)有任何線程,而是等待有任務(wù)到來(lái)才創(chuàng)建線程去執(zhí)行任務(wù),除非調(diào)用了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個(gè)方法的名字就可以看出,是預(yù)創(chuàng)建線程的意思,即在沒(méi)有任務(wù)到來(lái)之前就創(chuàng)建corePoolSize個(gè)線程或者一個(gè)線程。默認(rèn)情況下,在創(chuàng)建了線程池后,線程池中的線程數(shù)為0,當(dāng)有任務(wù)來(lái)之后,就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行任務(wù),當(dāng)線程池中的線程數(shù)目達(dá)到corePoolSize后,就會(huì)把到達(dá)的任務(wù)放到緩存隊(duì)列當(dāng)中;線程池最大線程數(shù)
,這個(gè)參數(shù)也是一個(gè)非常重要的參數(shù),它表示在線程池中最多能創(chuàng)建多少個(gè)線程;表示線程沒(méi)有任務(wù)執(zhí)行時(shí)最多保持多久時(shí)間會(huì)終止
。默認(rèn)情況下,只有當(dāng)線程池中的線程數(shù)大于corePoolSize時(shí),keepAliveTime才會(huì)起作用,直到線程池中的線程數(shù)不大于corePoolSize,即當(dāng)線程池中的線程數(shù)大于corePoolSize時(shí),如果一個(gè)線程空閑的時(shí)間達(dá)到keepAliveTime,則會(huì)終止,直到線程池中的線程數(shù)不超過(guò)corePoolSize。但是如果調(diào)用了allowCoreThreadTimeOut(boolean)方法,在線程池中的線程數(shù)不大于corePoolSize時(shí),keepAliveTime參數(shù)也會(huì)起作用,直到線程池中的線程數(shù)為0;時(shí)間單位
,有7種取值·
TimeUnit.DAYS; //
天
·
TimeUnit.HOURS; //
小時(shí)
·
TimeUnit.MINUTES; //
分鐘
·
TimeUnit.SECONDS; //
秒
·
TimeUnit.MILLISECONDS; //
毫秒
·
TimeUnit.MICROSECONDS; //
微妙
·
TimeUnit.NANOSECONDS; //
納秒
任務(wù)隊(duì)列
,是一個(gè)阻塞隊(duì)列,用來(lái)存儲(chǔ)等待執(zhí)行的任務(wù),這個(gè)參數(shù)的選擇也很重要,會(huì)對(duì)線程池的運(yùn)行過(guò)程產(chǎn)生重大影響,參考BlockingQueue·
ArrayBlockingQueue;
·
LinkedBlockingQueue;
·
SynchronousQueue;
線程工廠
,如何去創(chuàng)建線程的異常的捕捉器
,參考 RejectedExecutionHandler·
ThreadPoolExecutor.AbortPolicy:
丟棄任務(wù)并拋出
RejectedExecutionException
異常。
·
ThreadPoolExecutor.DiscardPolicy
:也是丟棄任務(wù),但是不拋出異常。
·
ThreadPoolExecutor.DiscardOldestPolicy
:丟棄隊(duì)列最前面的任務(wù),然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過(guò)程)
·
ThreadPoolExecutor.CallerRunsPolicy
:由調(diào)用線程處理該任務(wù)
corePoolSize
)個(gè)工人,每個(gè)工人同時(shí)只能做一件任務(wù)。來(lái)了任務(wù)就分配
給空閑的工人做;任務(wù)隊(duì)列
);創(chuàng)建新線程
)進(jìn)來(lái);然后就將任務(wù)也分配給這4個(gè)臨時(shí)工人做;拒絕執(zhí)行
)。空閑時(shí)間
),新任務(wù)增長(zhǎng)的速度又比較緩慢,工廠主管可能就考慮辭掉4個(gè)臨時(shí)工了,只保持原來(lái)的10個(gè)工人,畢竟請(qǐng)額外的工人是要花錢的ArrayBlockingQueue(
有界隊(duì)列
)
: FIFO 隊(duì)列,規(guī)定大小的BlockingQueue,其構(gòu)造函數(shù)必須帶一個(gè)int參數(shù)來(lái)指明其大小LinkedBlockingQueue(
無(wú)界隊(duì)列
)
:FIFO 隊(duì)列,大小不定的BlockingQueue,若其構(gòu)造函數(shù)帶一個(gè)規(guī)定大小的參數(shù),生成的BlockingQueue有大小限制,若不帶大小參數(shù),所生成的BlockingQueue的大小由Integer.MAX_VALUE來(lái)決定。PriorityBlockingQueue
:優(yōu)先級(jí)隊(duì)列, 類似于LinkedBlockingQueue,但隊(duì)列中元素非 FIFO, 依據(jù)對(duì)象的自然排序順序或者是構(gòu)造函數(shù)所帶的Comparator決定的順序SynchronousQueue(
直接提交策略
)
: 交替隊(duì)列,隊(duì)列中操作時(shí)必須是先放進(jìn)去,接著取出來(lái)
,交替著去處理元素的添加和移除,這是一個(gè)很有意思的阻塞隊(duì)列,其中每個(gè)插入操作必須等待另一個(gè)線程的移除操作,同樣任何一個(gè)移除操作都等待另一個(gè)線程的插入操作。因此此隊(duì)列內(nèi)部其 實(shí)沒(méi)有任何一個(gè)元素,或者說(shuō)容量是0,嚴(yán)格說(shuō)并不是一種容器。由于隊(duì)列沒(méi)有容量,因此不能調(diào)用peek操作,因?yàn)橹挥幸瞥貢r(shí)才有元素。拋出異常
直接執(zhí)行
加入的任務(wù)移除第一個(gè)任務(wù),執(zhí)行加入的任務(wù)
不做處理
Android+物聯(lián)網(wǎng)培訓(xùn)之模擬器創(chuàng)建的常見錯(cuò)誤
2017-07-02Android+物聯(lián)網(wǎng)培訓(xùn)實(shí)戰(zhàn)教程之屬性動(dòng)畫
2017-05-31Android+物聯(lián)網(wǎng)培訓(xùn)實(shí)戰(zhàn)教程之系統(tǒng)觸摸事件三步曲
2017-05-31Android+物聯(lián)網(wǎng)培訓(xùn)實(shí)戰(zhàn)教程之APK反編譯
2017-05-31Android+物聯(lián)網(wǎng)培訓(xùn)實(shí)戰(zhàn)教程之權(quán)重
2017-05-29Android+物聯(lián)網(wǎng)培訓(xùn)實(shí)戰(zhàn)教程之 9patch圖詳解
2017-05-29