所謂的線程池蚣抗,就是多個(gè)線程封裝到一起進(jìn)行操作。對(duì)應(yīng)的場(chǎng)景例如:針對(duì)某一項(xiàng)任務(wù)瓮下,需要多個(gè)線程同時(shí)操作翰铡。
線程池有三個(gè)情況:
- 工作很大,有多少人要多少人讽坏,一直到完成
- 工作很大锭魔,但是只能招聘10人
- 工作很大,但是只有一個(gè)人做
如何實(shí)現(xiàn)線程池呢震缭?
實(shí)現(xiàn)線程池的核心接口定義在java.utils.*
這個(gè)包中赂毯。
- 普通的執(zhí)行線程池:ExecutorService
- 調(diào)度線程池:ScheduledExecutorService(某些操作可以自動(dòng)定時(shí)完成)
要進(jìn)行線程池的創(chuàng)建战虏,一般使用Executors的幾個(gè)方法:
- Executors.newFixedThreadPool(3);
- Executors.newScheduledThreadPool(2);
- Executors.newSingleThreadExecutor();
- Executors.newSingleThreadScheduledExecutor();
- Executors.newCachedThreadPool();
線程池的底層實(shí)現(xiàn)代碼
01拣宰、newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads,
nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
02党涕、newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1,
1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
03、newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0,
Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
該方法返回一個(gè)可根據(jù)實(shí)際情況調(diào)整線程數(shù)量的線程池巡社,該線程池內(nèi)部在創(chuàng)建之初是沒(méi)有任何線程的膛堤,當(dāng)有任務(wù)到來(lái)時(shí),首先查看線程池中是否存在空閑線程晌该,如果沒(méi)有空閑線程則創(chuàng)建之肥荔;反之則分配一個(gè)空閑線程來(lái)處理新到的任務(wù);所有任務(wù)完成后朝群,則將線程返還到線程中并重新設(shè)置為空閑狀態(tài)燕耿,便于線程復(fù)用。
04姜胖、newSingleThreadScheduleExecutor
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
05誉帅、newScheduleThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
總結(jié)
- newFixedThreadPool創(chuàng)建一個(gè)可重用固定線程數(shù)目的線程池,以共享的無(wú)界隊(duì)列方式來(lái)運(yùn)行這些線程右莱;該線程池在任意時(shí)刻都有固定數(shù)目的線程蚜锨;如果線程不夠使用,則會(huì)將新到的任務(wù)進(jìn)行緩存排隊(duì)慢蜓。
- newSingleThreadExecutor創(chuàng)建一個(gè)單線程的線程池亚再;這個(gè)線程池最多只有一個(gè)線程在處理任務(wù),也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)晨抡;如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束氛悬,那么會(huì)有一個(gè)新的線程來(lái)替代他。該線程池可以保證所有的任務(wù)的執(zhí)行順序按照任務(wù)提交的順序執(zhí)行耘柱。
- newCachedThreadPool創(chuàng)建一個(gè)線程池大小可根據(jù)任務(wù)到來(lái)的情況進(jìn)行自動(dòng)伸縮的線程池圆雁,對(duì)于執(zhí)行很多短期異步任務(wù)的程序而言,可以大大提升程序性能帆谍;該方法可以實(shí)現(xiàn)復(fù)用空閑線程伪朽;同時(shí)會(huì)自動(dòng)移除60秒內(nèi)未被使用的空閑線程,自動(dòng)降低空間資源開銷汛蝙。
- newSingleThreadScheduleExecutor創(chuàng)建一個(gè)單線程的線程池烈涮;主要用于在給定的延遲之后運(yùn)行任務(wù),或定期執(zhí)行任務(wù)窖剑;其功能與Timer類似坚洽。
- newScheduleThreadPool創(chuàng)建一個(gè)指定數(shù)量線程的線程池,其功能與4相同西土。