ThreadPoolExecutor 線程池
創(chuàng)建線程池左痢,主要利用 ThreadPoolExecutor 這個(gè)類泼诱,
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
corePoolSize: 該線程池中核心線程的數(shù)量彤枢。
注意:線程池中存在核心線程與非核心線程膘融,核心線程一旦創(chuàng)建會(huì)一直執(zhí)行任務(wù)或等待任務(wù)到來杭煎,而非核心線程只在任務(wù)隊(duì)列塞滿任務(wù)時(shí)去執(zhí)行多出的任務(wù)溉知,并且非核心線程在等待一段時(shí)間后將會(huì)被回收猖腕,這個(gè)時(shí)間作為參數(shù)可調(diào)配馋评,
maximumPoolSize:該線程池中最大線程數(shù)量诗芜。(區(qū)別于corePoolSize)
keepAliveTime:從字面上就可以理解瞳抓,是非核心線程空閑時(shí)要等待下一個(gè)任務(wù)到來的時(shí)間埃疫,當(dāng)任務(wù)很多,每個(gè)任務(wù)執(zhí)行時(shí)間很短的情況下調(diào)大該值有助于提高線程利用率挨下。
注意:當(dāng)allowCoreThreadTimeOut屬性設(shè)為true時(shí)熔恢,該屬性也可用于核心線程。
unit:上面時(shí)間屬性的單位
workQueue:任務(wù)隊(duì)列臭笆,后面詳述叙淌。
threadFactory:線程工廠,可用于設(shè)置線程名字等等愁铺,一般無須設(shè)置該參數(shù)鹰霍。
handler: 飽和策略
線程執(zhí)行流程
1.execute一個(gè)線程之后,如果線程池中的線程數(shù)未達(dá)到核心線程數(shù)茵乱,則會(huì)立馬啟用一個(gè)核心線程去執(zhí)行茂洒。
2.execute一個(gè)線程之后,如果線程池中的線程數(shù)已經(jīng)達(dá)到核心線程數(shù)瓶竭,且workQueue未滿督勺,則將新任務(wù)放入workQueue中等待執(zhí)行。
3.execute一個(gè)線程之后斤贰,如果線程池中的線程數(shù)已經(jīng)達(dá)到核心線程數(shù)但未超過非核心線程數(shù)智哀,且workQueue已滿,則開啟一個(gè)非核心線程來執(zhí)行任務(wù)荧恍。
4.execute一個(gè)線程之后瓷叫,如果線程池中的線程數(shù)已經(jīng)超過非核心線程數(shù),則拒絕執(zhí)行該任務(wù)送巡,采取飽和策略摹菠,并拋出RejectedExecutionException異常。
注意 使用 threadFactory工廠的時(shí)候骗爆,
public interface ThreadFactory {
Thread newThread(Runnable r);
}
創(chuàng)建Thread的時(shí)候次氨,需要把runnbale對(duì)象傳遞給創(chuàng)建的thread類,
如果不傳遞的話淮腾,線程執(zhí)行的時(shí)候糟需,會(huì)運(yùn)行thread的run方法
val threadFactory = ThreadFactory {
val thread = Thread(it)
thread.name = "executor-${seq.getAndIncrement()}"
thread
}