線程池的優(yōu)點(diǎn)
1.重用線程池中的線程绊袋,避免線程的創(chuàng)建和銷毀所帶來的性能開銷。
2.控制線程池的最大并發(fā)數(shù)铸鹰,避免大量的線程之間因相互搶占系統(tǒng)資源導(dǎo)致的阻塞現(xiàn)象癌别。
3.能夠?qū)€程進(jìn)行簡(jiǎn)單的管理,并提供定時(shí)執(zhí)行以及指定間隔循環(huán)執(zhí)行等功能蹋笼。
ThreadPoolExecutor
線程池的真正實(shí)現(xiàn)展姐,它的構(gòu)造方法提供了一系列參數(shù)來配置線程池。
corePoolSize:核心線程數(shù)(CPU核心數(shù)+1)
maximumPoolSize:最大線程數(shù)(CUP核心數(shù)×2+1)
keepAliveTime:非核心線程閑置的超時(shí)時(shí)長(zhǎng)(1秒)
unit:指定keepAliveTime的時(shí)間單位
workQueue:線程池中的任務(wù)隊(duì)列(容量128)
threadFactory:線程工廠剖毯,為線程池提供創(chuàng)建新線程的功能圾笨。
ThreadPoolExecutor執(zhí)行規(guī)則
1.如果線程池中的線程數(shù)量未達(dá)到核心線程數(shù)量,會(huì)直接啟動(dòng)一個(gè)核心線程執(zhí)行任務(wù)逊谋。
2.如果線程池中的線程數(shù)量已經(jīng)達(dá)到或者超過核心線程數(shù)量擂达,那么任務(wù)會(huì)被插入到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行。
3.如果無法插入到任務(wù)隊(duì)列中涣狗,往往是由于任務(wù)隊(duì)列已滿谍婉,這時(shí)候如果線程數(shù)量未達(dá)到線程池規(guī)定的最大值,則立刻啟動(dòng)一個(gè)非核心線程來執(zhí)行任務(wù)镀钓。
4.如果線程數(shù)量已經(jīng)達(dá)到線程池規(guī)定的最大值穗熬,那么就拒絕執(zhí)行此任務(wù),ThreadPoolExecutor會(huì)調(diào)用RejectedExecutionHandler的rejectedExecution方法通知調(diào)用者丁溅。
線程池的分類
FixedThreadPool
只有核心線程唤蔗、線程數(shù)量固定、沒有超時(shí)機(jī)制窟赏、空閑狀態(tài)也不會(huì)被回收妓柜、任務(wù)隊(duì)列也沒有大小限制
CachedThreadPool
只有核心線程、線程數(shù)量不定涯穷、有超時(shí)機(jī)制棍掐、60秒閑置線程回收、最大線程數(shù)是Integer.MAX_VALUE
ScheduledThreadPool
核心線程固定拷况、非核心線程Integer.MAX_VALUE作煌、非核心線程閑置立即被回收
SingleThreadExecutor
只有一個(gè)核心線程、所有任務(wù)都在同一線程中按順序執(zhí)行