Java 线程池
为什么需要线程池
java 中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承 Thread 或者实现
Runnable 接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同
时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管
理。
加快请求响应(响应时间优先)
加快处理大任务(吞吐量优先)
常见的线程池有哪几个种
CachedThreadPool:可缓存的线程池 SecudleThreadPool:周期性执行任务的线程池
SingleThreadPool:只有一条线程来执行任务 FixedThreadPool:定长的线程池
一般我们线上不会直接使用上述四种;
1)FixedThreadPool 和 SingleThreadPool 允许的请求队列长度为 Integer.Max_Value,可能会堆积大量
的请求,从而导致 OOM
2)CachedThreadPool:允许的创建线程数量为 Integer.Max_Value,可能会创建大量的线程,从而导致
OOM
线程池它是有一个核心线程数,当你的线程运行的时候,如果你没有设置成预启动加载,线程数为
0,当你提交一个新任务的时候,它会首先是建立一个核心线程;
它之前的有没有执行完那么你会一直建核心线程。
当达到最大核心线程数时,如果还都在忙,那么就会放到 BlockingQueue 里面作为节点,如果
BlockingQueue 队列也放满了,而且核心线程都在忙。那就会去建立新线程,它叫做非核心线程。若
一直创建,数量达到非核心线程数 max access。就会触发一个拒绝策略,JDK 内置了四种拒绝策略。
第一种是 AbortPolicy,直接抛出异常来解决
评论0
最新资源