java(Android)線程池

系統啓動一個新的線程的成本是比較高的,由於它涉及到了有操做系統的交互,當程序性要建立大量生存期很短暫的線程時,更應該考慮使用線程池。

 

線程池在啓動時即建立了大量的空閒的線程,能夠指定線程的數量,但一個Runnable對象傳給線程池是,線程池就會啓動一個線程來執行它們的run()方法。當run()方法執行完畢時,該線程並不會死亡,而是再次返回線程池中成爲空閒狀態。等待執行下一個Runnable對象的run()方法java

 

線程池能夠設置最大的併發線程數。緩存

 

 

一、new Thread 的弊端

執行一個異步任務若是是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 線程池

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()方法,該方法將啓動線程池的關閉序列,調用該方法後的線程池再也不接收新任務,但會將之前全部已提交任務執行完畢。但線程池中的全部任務都執行完成後,池中的全部線程都會死亡。

相關文章
相關標籤/搜索