因為我們都知道一個線程run
方法執(zhí)行完畢后,才算真正結(jié)束,但是,這只是結(jié)束,并沒有被回收,會一直閑置在那里,等待
GC
去回收,所以如果每執(zhí)行一個任務(wù),我們都
new
一個線程,那么在某些極端的場景下,是比較消耗內(nèi)存的。
本文
先簡單介紹下Android
中自帶的四種線程池:
1
、
newCachedThreadPool
這種線程池比較靈活,也就是說它的池里的線程數(shù)量并不是固定的,理論上可以無限大,任務(wù)不需要排隊,如果有空閑的線程,則復(fù)用,無則新建線程。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(
new Runnable() {
@Override
public
void
run() {
// TODO Auto-generated method stub
}
});
2
、
newFixedThreadPool
這個算是一個中規(guī)中矩,也是Android sdk
的源碼中用的比較多的,它的池子里的線程數(shù)有個最大值,可以自己設(shè)置,如果超過這個最大值,那么任務(wù)就會加入任務(wù)隊列去等待。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
fixedThreadPool.execute(
new Runnable() {
@Override
public
void
run() {
// TODO Auto-generated method stub
}
});
3
、
newSingleThreadExecutor
如字面意思,這是一個單例化的線程池,他只有一個線程去執(zhí)行任務(wù)。最常見的一個例子就是我們的UI
線程啦。它就是典型的單線程模型。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(
new Runnable() {
@Override
public
void
run() {
// TODO Auto-generated method stub
}
});
4
、
newScheduledThreadPool
這也是一個定長的線程池,但是可以支持周期性的任務(wù)。
以下例子表示延遲一秒過后,每兩秒執(zhí)行一次。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.scheduleAtFixedRate(
new Runnable() {
@Override
public
void
run() {
}
},1, 2, TimeUnit.SECONDS);
來源:
簡書