带着问题去学习 -------
1、为什么使用线程池?
2、线程是不是越多越好?
3、如何确定合适数量的线程数?

第一个问题 – 使用线程池是为了更方便的控制线程的数量,不需要频繁的创建和销毁线程。
第二个问题 – 线程越多越好,其实不是的,主要从三个方面考虑:

  1. 时间 -->线程在java中是一个对象,更是一个操作系统的资源,线程创建和销毁都需要时间,如果 创建时间+销毁时间 >= 线程执行时间 , 如此设计就不合理了。
  2. 内存 -->java对象会占用堆内存,操作系统中的线程会占用运行内存,线程过多会消耗很大的内存。
  3. 性能 --> 操作系统需要频繁的切换线程(同一时刻只能执行一个线程,CPU时间片管理)会大大的影响cpu的性能。

第三个问题–线程数量的确定
计算型任务: CPU的1~2倍。
IO型任务:根据IO阻塞时长考量决定,tomcat默认200。

线程池原理

概念部分

线程池管理器

用来创建并且管理线程池,包括创建线程,销毁线程, 添加新任务;

工作线程

线程池中的线程,在没有任务时处于一个等待状态,可以循环的执行任务。

任务接口

每个任务必须实现的接口,供工作线程调度调度的执行,它主要规定了任务的入口,任务执行完毕后的收尾工作,任务的执行状态。

任务队列

用于存放没有处理的任务,提供一种缓冲机制。

java线程池的线程数与cpu数量的关系 线程池是不是越多越好_多线程

线程池API

java线程池的线程数与cpu数量的关系 线程池是不是越多越好_工作队列_02


java线程池的线程数与cpu数量的关系 线程池是不是越多越好_工作队列_03


java线程池的线程数与cpu数量的关系 线程池是不是越多越好_工作队列_04


java线程池的线程数与cpu数量的关系 线程池是不是越多越好_线程池_05

线程的执行原理:

先判断是否达到核心线程,没有达到,则创建新的线程。如果达到了就去判断工作队列有没有满,如果没有满就丢到工作队列中,如果满了就去判断是否达到最大线程数量,没有达到就创建新的线程,如果达到了最大线程数量,就会拒绝执行任务。

java线程池的线程数与cpu数量的关系 线程池是不是越多越好_多线程_06