一、线程池的参数介绍
我们学到线程池时 看到线程池中的七个构造方法可能有些不太了解,下面让我来说一下这七个构造方法都是什么作用
1.corePoolSize
表示的是线程池核心线程大小 核心线程就是即使当前处于空闲状态 但是他们也不会被销毁
2.maximumPoolSize 表示线程池最大线程数量
3.keepAliveTime 表示空闲线程存活时间
4.unit 表示空闲线程存活时间单位
5.workQueue 表示工作队列
工作队列的类型有 ArrayBlockingQueue(基于数组实现) LinkedBlockingQuene(基于链表实现)
SynchronousQuene(不缓存任务) PriorityBlockingQueue(基于优先级队列实现)
6.threadFactory 表示线程工厂
7.handler 表示拒绝策略
拒接策略一共有四种 1.AbortPolicy 直接丢弃任务并抛出异常
2.CallerRunsPolicy 让添加的线程自己完成这个任务
3.DiscardPolicy 丢弃最新的任务
4.DiscardOldestPolicy 丢弃最老的任务
二、线程池的工作流程
- 在创建了线程池后,等待提交过来的任务请求
- 当调用execute()方法添加一个请求任务时,线程池会做出如下判断
- 如果正在运行的线程池数量小于corePoolSize,那么马上创建线程运行这个任务
- 如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列
- 如果这时候队列满了,并且正在运行的线程数量还小于maximumPoolSize,那么还是创建非核心线程like运行这个任务;
- 如果队列满了并且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行
- 当一个线程完成任务时,它会从队列中取下一个任务来执行
- 当一个线程无事可做操作一定的时间(keepAliveTime)时,线程池会判断:
- 如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉
- 所以线程池的所有任务完成后,它会最终收缩到corePoolSize的大小
三、使用Executors 创建常见的线程池
1.newCachedThreadPool :创建一个可缓存线程池
2.newFixedThreadPool:创建一个固定大小的线程池
3.newScheduledThreadPool : 创建一个定时线程池
4.newSingleThreadExecutor :创建一个单线程化的线程池