線(xiàn)程池
1.幾種常用的線(xiàn)程池
包括:newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool;
1.1 newSingleThreadExecutor
創(chuàng)建一個(gè)單線(xiàn)程的線(xiàn)程池。這個(gè)線(xiàn)程池只有一個(gè)線(xiàn)程在工作,也就是相當(dāng)于單線(xiàn)程串行執(zhí)行所有任務(wù)择份。如果這個(gè)唯一的線(xiàn)程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線(xiàn)程來(lái)替代它烫堤。此線(xiàn)程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行荣赶。
1.2 newFixedThreadPool
1.2.1 說(shuō)明
創(chuàng)建固定大小的線(xiàn)程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線(xiàn)程鸽斟,直到線(xiàn)程達(dá)到線(xiàn)程池的最大大小拔创。線(xiàn)程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線(xiàn)程因?yàn)閳?zhí)行異常而結(jié)束湾盗,那么線(xiàn)程池會(huì)補(bǔ)充一個(gè)新線(xiàn)程伏蚊。
1.2.2 用法
ExecutorService executor = Executors.newFixedThreadPool(2);
//設(shè)置線(xiàn)程池總計(jì)數(shù)
final CountDownLatch countDownLatch = new CountDownLatch(2);
//第一個(gè)線(xiàn)程池
executor.execute(()->{
try {
//業(yè)務(wù)處理1
}finally {
//計(jì)數(shù)減一
countDownLatch.countDown();
}
});
//第二個(gè)線(xiàn)程池
executor.execute(()->{
try {
//業(yè)務(wù)處理2
}finally {
//計(jì)數(shù)減二
countDownLatch.countDown();
}
});
// 會(huì)阻塞在這里等待 mCountDownLatch 里的count變?yōu)?;
// 也就是等待另外的WorkingThread調(diào)用countDown()
try {
countDownLatch.await();
} catch (InterruptedException e) {
log.error("處理業(yè)務(wù)信息失敗格粪,失敗信息躏吊,{}", e);
//拋出異常
<!-- throw new BusinessException(CommonErrorCode.SYSTEM_INNER_ERROR.getCode(),
CommonErrorCode.SYSTEM_INNER_ERROR.getDesc()); -->
}
1.3 newCachedThreadPool
創(chuàng)建一個(gè)可緩存的線(xiàn)程池。如果線(xiàn)程池的大小超過(guò)了處理任務(wù)所需要的線(xiàn)程帐萎,
那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線(xiàn)程比伏,當(dāng)任務(wù)數(shù)增加時(shí),此線(xiàn)程池又可以智能的添加新線(xiàn)程來(lái)處理任務(wù)疆导。此線(xiàn)程池不會(huì)對(duì)線(xiàn)程池大小做限制赁项,線(xiàn)程池大小完全依賴(lài)于操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線(xiàn)程大小。
1.4 newScheduledThreadPool
創(chuàng)建一個(gè)大小無(wú)限的線(xiàn)程池。此線(xiàn)程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求悠菜。