java中創(chuàng)建線程池有兩種方式
1.通過提供的工具類Executors進(jìn)行創(chuàng)建胯盯。
但是不推薦這樣創(chuàng)建,通過源碼可以看到掐禁,它創(chuàng)建出來的四個(gè)線程池都存在問題毛秘。
Executors 返回線程池對(duì)象的弊端如下:
FixedThreadPool 和 SingleThreadExecutor : 允許請(qǐng)求的隊(duì)列長度為Integer.MAX_VALUE ,可能堆積大量的請(qǐng)求胡控,從而導(dǎo)致 OOM扳剿。
CachedThreadPool 和 ScheduledThreadPool : 允許創(chuàng)建的最大線程數(shù)量為 Integer.MAX_VALUE ,可能會(huì)創(chuàng)建大量線程铜犬,從而導(dǎo)致 OOM舞终。
2.通過ThreadPoolExecutors自己創(chuàng)建
上面的工具類也是這樣創(chuàng)建的轻庆。
ExecutorService executorService = new ThreadPoolExecutor(
2,//核心線程數(shù)量
5,//最大線程數(shù)量
30,//超過核心線程數(shù)的線程空閑時(shí)的存活時(shí)間
TimeUnit.SECONDS,//時(shí)間的單位
new LinkedBlockingDeque<Runnable>(3),//等待隊(duì)列
Executors.defaultThreadFactory(),//創(chuàng)建線程時(shí)需要的癣猾,默認(rèn)就好
/*
CallerRunsPolicy:調(diào)用者模式,當(dāng)線程超過線程所能容納的最大線程時(shí)余爆,把多余的線程回退給調(diào)用者
這里是回退給main纷宇。
AbortPolicy:終止模式,直接報(bào)異常蛾方。
DiscardOldestPolicy:丟棄最老的一個(gè)不報(bào)異常像捶。
DiscardPolicy:丟棄
*/
new ThreadPoolExecutor.DiscardPolicy());//拒絕策略
try {
for (int i = 0; i < 10; i++) {
executorService.execute(()->{
System.out.println(Thread.currentThread().getName()+"辦理業(yè)務(wù)");
});
}
}finally {
executorService.shutdown();
Object o = new Object();
}
線程進(jìn)入線程池的流程:
當(dāng)擴(kuò)容來的線程無事做操作最大存活時(shí)間,就會(huì)停掉桩砰,回退到核心線程的數(shù)量拓春。