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