为什么要用线程池?
什么是线程池?
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,在需要执行新的任务时重用这些线程而不是新建一个线程
使用线程池的好处?
- 线程池改进了一个应用程序的响应时间,由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程
- 线程池节省了CLR 为每个短生存周期任务创建一个完整的线程开销并可以在任务完成后回收资源
- 线程池根据当前在系统中运行的进程来优化线程时间片
- 线程池允许开启多个任务而不用为每个线程设置属性
- 线程池允许为正在执行的任务程序参数传递一个包含状态信息的对象引用
- 线程池可以用来解决处理一个特定请求最大线程数量限制问题
线程池的优点?
- 重用存在的线程,减少对象创建销毁的开销
- 控制最大并发线程数,提高系统资源的使用率,避免过多资源竞争,避免堵塞
- 提供定时执行、定期执行、单线程、并发数控制等功能
线程池的主要参数和处理流程?
主要参数有:
- 线程池核心线程数大小
- 最大线程数
- 存储的队列
- 拒绝策略
- 空闲线程存活时长
处理流程有:
当需要任务大于核心线程数时,把任务存放在存储任务的队列里,
当存储队列满,就开始增加线程池创建的线程数量,
如果线程数量也达最大,就开始执行拒绝策略(如记录日志,直接丢掉,或丢弃最老任务,或交给提交任务的线程执行)
当一个线程完成时,它会从队列中取下一个任务来执行,
当一个线程无事可做,且超过一定时间时,如果当前运行的线程数大于核心线程数,那这个线程会停掉
有几种线程池?线程池的实现过程?
1> newFixedThreadPool 创建一个指定大小的线程池,每当提交一个任务就创建一个线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到等待队列中
2> newCachedThreadPool 创建一个可缓存的线程池
特点是:
- 工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger.MAX_VALUE),这样可灵活的往线程池中添加线程
- 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止,终止后,如果又提交了新的任务,则线程池重新创建一个工作线程
3> newSingleThreadExecutor 常见一个单线程的Executor,即之创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行
4> newScheduleThreadPool 创建一个定长的线程池,支持定时和周期性的任务执行,如Timer