線程池在啓動時即建立了大量的空閒的線程,能夠指定線程的數量,但一個Runnable對象傳給線程池是,線程池就會啓動一個線程來執行它們的run()方法。當run()方法執行完畢時,該線程並不會死亡,而是再次返回線程池中成爲空閒狀態。等待執行下一個Runnable對象的run()方法java
線程池能夠設置最大的併發線程數。緩存
執行一個異步任務若是是new Thread:服務器
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start();
這樣會有以下的弊端:網絡
a.每次new Thread 新建對象的性能差多線程
b. 線程缺少統一管理,可能無限制新建線程,相互之間競爭,及可能佔用過多系統資源致使死機併發
c.缺少更多功能,如定時執行,按期執行、線程中斷異步
相比new Thread ,java 提供的四種線程池的好處在於:ide
a.重用存在的線程,減小對象的建立、消亡的開銷,性能佳,減小CPU在建立、消除的開銷。性能
好比:spa
假設在一臺服務器完成一項任務的時間爲T
T1 建立線程的時間
T2 在線程中執行任務的時間,包括線程間同步所需時間
T3 線程銷燬的時間
顯然T = T1+T2+T3。注意這是一個極度簡化的假設。
能夠看出T1,T3是多線程自己的帶來的開銷,咱們渴望減小T1,T3所用的時間,從而減小T的時間。但一些線程的使用者並無注意到這一點,因此在程序中頻繁的建立或銷燬線程,這致使T1和T3在T中佔有至關比例。顯然這是突出了線程的弱點(T1,T3),而不是優勢(併發性)。
b.可有效控制最大併發線程數,提升系統資源的使用率,同時避免過多資源競爭,避免阻塞
c.提供定時執行、按期執行、單線程、併發數控制等功能。
在Android中當同時併發多個網絡線程時,引入線程池技術會極大地提升APP的性能
java 中有內置線程池 有兩種線程池對象 ExecutorService----表示儘快執行線程的線程池(只要線程池中有空閒線程,就當即執行線程任務)、ScheduledExecutorService(scheduled 表示能夠延遲後執行,是ExecutorService的子類)
newCachedThreadPool建立一個可緩存線程池,若是線程池長度超過處理須要,可靈活回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
newScheduledThreadPool 建立一個定長線程池,支持定時及週期性任務執行。參數表示保存的線程數,即便線程是空閒的也被保存在線程池中。
newSingleThreadExecutor 建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。
使用線程池
JDK自身帶有線程池的實現類ThreadPoolExecutor
ExecutorService 提供了三個方法
一、Future<?> submit(Runnable task) 將一個Runnable 對象提交給指定的線程池,線程池將在有空閒線程是執行Runnable對象表明的任務,其中Future對象表明Runnable任務的返回值--可是run()方法執行結束後返回Null ,但能夠調用Future的isDone()、isCancelled()方法來得到Runnable對象的執行狀態。
二、<T>Future<T> submit(Runnable task,T result) 將一個Runnable 對象提交給指定的線程池,線程池將在有空閒線程是執行Runnable對象表明的任務,其中Future對象表明Runnable任務的返回值--能夠指定顯示的返回值,result爲線程執行結束後的返回值。
ScheduledExecutorService 表明可在指定延遲後或週期性地執行線程任務的線程池。
一、ScheduledFuture<V> schedule(Runnable command ,long delay,TimeUnit unit)
指定command 任務將在delay延遲後執行。
二、ScheduledFuture<V> scheduleAtFixedRate(Runnable command ,long delay,long period,TimeUnit unit) 指定command 任務將在delay延遲後執行。並設置頻率重複執行,也就是在delay+period、delay+2*period.........(重複執行)
用完一個線程池後,應該調用該線程池的shutdown()方法,該方法將啓動線程池的關閉序列,調用該方法後的線程池再也不接收新任務,但會將之前全部已提交任務執行完畢。但線程池中的全部任務都執行完成後,池中的全部線程都會死亡。