线程池必须掌握的内容:三大方法、7大参数、4种拒绝策略
程序的运行的本质:占用系统的资源,所以要优化资源的使用,所以演化出一种策略,池化技术。
线程池、连接池、内存池、对象池。。。。。创建和销毁非常浪费资源
池化技术:事先准备好一些资源,有人要用,就从这里拿,用完之后还回来。
默认大小:2
线程池的好处:
1)降低资源的消耗
2)提高响应的速度
3)方便管理
线程复用、可以控制最大并发数,管理线程
线程池的三大方法:
1、Executors.newSingleThreadExecutor(); //创建单个线程池
2、Executors.newFixedThreadPool(6); //创建一个大小固定的线程池,比如创建6个线程-->则该线程池最高可以有6个并发,最多可以有6个线程同时执行
3、Executors.newCachedThreadPool(); //可伸缩的线程池
注意:使用了线程池之后,要使用线程池来创建线程
线程池用完,程序结束,需要关闭线程池
线程池不允许使用Executors创建,而是通过ThreadPoolExecutor的方式
Executors返回的线程池对象的弊端:
1)FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE(约为21亿),可能会堆积大量的请求,从而导致OOM
2)CachedThreadPool和ScheduledThreadPool:允许创建的线程数量为nteger.MAX_VALUE(约为21亿)可能会创建大量的线程,从而导致OOM
线程池的7大参数:
public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
int maximumPoolSize,//最大核心线程池大小
long keepAliveTime,//超时了,没有人调用就会释放
TimeUnit unit,//超时时间的单位
BlockingQueue<Runnable> workQueue,//阻塞队列
ThreadFactory threadFactory,//线程工厂,创建线程的,一般不用动
RejectedExecutionHandler handler//拒绝策略
){}
4种拒绝策略:
new ThreadPoolExecutor.AbortPolicy()//线程池满了,还有线程进来,不处理该线程,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去哪里
new ThreadPoolExecutor.DiscardPolicy()//队列满了,丢掉任务,不会抛出异常
new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了,尝试和最早的竞争,不会抛出异常
小结和拓展:
1、池的最大大小(最大线程)应该如何设置:(了解---用于调优的)
1)CPU密集型:几核就是几,可以保持CPU的效率最高
//获取CPU 的核数
Runtime.getRuntime().availableProcessors();//该数值作为最大线程数
2)IO 密集型:程序中十分耗IO的线程的个数*2