使用線程池的好處
1.降低資源消耗(復(fù)用線程) 2.提高響應(yīng)速度(不需要?jiǎng)?chuàng)建線程) 3.提高線程的可管理性
線程池的幾個(gè)參數(shù)
1.corePoolSize(核心線程池基本大小) 2.maxmumPoolSize(線程池最大線程數(shù))
3.keepAliveTime(線程活動(dòng)保持時(shí)間),4.TimeUnit(線程活動(dòng)保持時(shí)間的單位,day-nanos)
5.runnableTaskQueue(工作隊(duì)列) ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,PriorityBlockingQueue
6.RejectedExecutionHandler(飽和策咯)
AbortPolicy直接拋出異常,CallerRunsPolicy只用調(diào)用者所在線程來(lái)運(yùn)行任務(wù),DiscardOldestPolicy丟棄隊(duì)列里最近的一個(gè)任務(wù),執(zhí)行當(dāng)前任務(wù);DiscardPolicy不處理,丟棄
固定線程池,0L,則任務(wù)完成后立刻刪除,那么仍然需要?jiǎng)?chuàng)建線程,則怎么復(fù)用? 還是先判斷任務(wù)隊(duì)列沒(méi)job再丟棄?
配置線程池大小: 可通過(guò)Runtime.getRuntime().availableProcessors()獲得當(dāng)前CPU數(shù)
1.CPU密集型--N(cpu)+1;2.IO密集型--2*N(cpu)
使用線程池不僅可以提高應(yīng)用的響應(yīng)時(shí)間,還可以避免"java.lang.OutOfMemoryError: unable to create new native thread"之類的錯(cuò)誤。
建議設(shè)置為有界隊(duì)列
StackOverflowError是由于當(dāng)前線程的棧滿了 那么二者有什么區(qū)別?
線程池監(jiān)控
taskCount:線程池需要執(zhí)行的任務(wù)數(shù)量
completedTaskCount:線程池在運(yùn)行過(guò)程中已完成的任務(wù)數(shù)量
largestPoolSize:線程池曾創(chuàng)建過(guò)的最大線程數(shù)量
getPoolSize:線程池的線程數(shù)量
getActiveCount:活動(dòng)的線程數(shù)