带着问题去学习 -------
1、为什么使用线程池?
2、线程是不是越多越好?
3、如何确定合适数量的线程数?
第一个问题 – 使用线程池是为了更方便的控制线程的数量,不需要频繁的创建和销毁线程。
第二个问题 – 线程越多越好,其实不是的,主要从三个方面考虑:
- 时间 -->线程在java中是一个对象,更是一个操作系统的资源,线程创建和销毁都需要时间,如果 创建时间+销毁时间 >= 线程执行时间 , 如此设计就不合理了。
- 内存 -->java对象会占用堆内存,操作系统中的线程会占用运行内存,线程过多会消耗很大的内存。
- 性能 --> 操作系统需要频繁的切换线程(同一时刻只能执行一个线程,CPU时间片管理)会大大的影响cpu的性能。
第三个问题–线程数量的确定
计算型任务: CPU的1~2倍。
IO型任务:根据IO阻塞时长考量决定,tomcat默认200。
线程池原理
概念部分
线程池管理器:
用来创建并且管理线程池,包括创建线程,销毁线程, 添加新任务;
工作线程:
线程池中的线程,在没有任务时处于一个等待状态,可以循环的执行任务。
任务接口:
每个任务必须实现的接口,供工作线程调度调度的执行,它主要规定了任务的入口,任务执行完毕后的收尾工作,任务的执行状态。
任务队列:
用于存放没有处理的任务,提供一种缓冲机制。
线程池API
线程的执行原理:
先判断是否达到核心线程,没有达到,则创建新的线程。如果达到了就去判断工作队列有没有满,如果没有满就丢到工作队列中,如果满了就去判断是否达到最大线程数量,没有达到就创建新的线程,如果达到了最大线程数量,就会拒绝执行任务。