线程池出现原因?
当线程数量越来越多的时候,单一按照流程走下去,会发现执行效率非常低下,无法满足大批量操作需求,那么如何在硬件资源一致地条件下,更迅速地完成任务,这时线程池就出现了。
线程池的优势?
1. 利用懒加载方式创建线程且能够充分利用现有线程资源,避免资源浪费。
2. 适合大批量执行线程,效率更快。
线程池什么情况下会拒绝执行线程?
当线程池中的线程达到核心线程数,阻塞队列已满且达到最大线程数,这是如果还有线程要执行,线程池将采取一些拒绝策略,防止源源不断地线程压垮整个服务。
拒绝策略方式
1. AbortPolicy: 丢弃任务,并抛出异常信息,线程池默认地拒绝策略,适用于比较关键地业务。
2.DiscardPolicy:丢弃任务,不抛出异常,啥也不干,适用于无关紧要业务,如文章阅读量。
3.DiscardOldestPolicy: 丢弃阻塞队列中最老的任务,并将新任务加入,是否要采用此种拒绝策略,还得根据实际业务是否允许丢弃老任务来认真衡量。
4.CallerRunsPolicy: 由调用线程直接运行该任务,适用于并发量比较小,性能要求不高,不允许失败业务。
执行测试
public static ThreadPoolExecutor getAbordPool(){
return new ThreadPoolExecutor(5,5,10,TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10),new ThreadPoolExecutor.AbortPolicy());
}
public static void main(String args[]){
ThreadPoolExecutor threadPoolExecutor = getAbordPool();
while(true){
threadPoolExecutor.execute(()->{
try {
System.out.println("queue="+threadPoolExecutor.getQueue().size());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
执行结果
