在Android開(kāi)發(fā)中,如果我們要執(zhí)行某個(gè)耗時(shí)任務(wù),一般都會(huì)考慮開(kāi)啟一個(gè)線程去處理。
因?yàn)槲覀兌贾酪粋€(gè)線程run方法執(zhí)行完畢后,才算真正結(jié)束,但是,這只是結(jié)束,并沒(méi)有被回收,會(huì)一直閑置在那里,等待GC去回收,所以如果每執(zhí)行一個(gè)任務(wù),我們都new一個(gè)線程,那么在某些極端的場(chǎng)景下,是比較消耗內(nèi)存的。
之前的內(nèi)存優(yōu)化的文章中,我講過(guò)關(guān)于android中的池的概念,也就是復(fù)用的機(jī)制,那么對(duì)于線程也有個(gè)線程池。
這篇文章先簡(jiǎn)單介紹下Android中自帶的四種線程池:
1 、newCachedThreadPool
這種線程池比較靈活,也就是說(shuō)它的池里的線程數(shù)量并不是固定的,理論上可以無(wú)限大,任務(wù)不需要排隊(duì),如果有空閑的線程,則復(fù)用,無(wú)則新建線程。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); cachedThreadPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } });2、newFixedThreadPool
這個(gè)算是一個(gè)中規(guī)中矩,也是Android sdk的源碼中用的比較多的,它的池子里的線程數(shù)有個(gè)最大值,可以自己設(shè)置,如果超過(guò)這個(gè)最大值,那么任務(wù)就會(huì)加入任務(wù)隊(duì)列去等待。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); fixedThreadPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } });3、 newSingleThreadExecutor
如字面意思,這是一個(gè)單例化的線程池,他只有一個(gè)線程去執(zhí)行任務(wù)。最常見(jiàn)的一個(gè)例子就是我們的UI線程啦。它就是典型的單線程模型。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); singleThreadExecutor.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } });4、newScheduledThreadPool
這也是一個(gè)定長(zhǎng)的線程池,但是可以支持周期性的任務(wù)。
以下例子表示延遲一秒過(guò)后,每?jī)擅雸?zhí)行一次。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { } },1, 2, TimeUnit.SECONDS);以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選