线程池原理总结

线程是一种稀缺资源,他的创建和销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,其线程的创建需要进行操作系统状态的切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优和监控。

什么时候使用线程:

  (1)单个任务处理时间比较短;

  (2)需要处理的任务数量很大

线程池的优势

  (1)重用存在的线程,减少线程创建,消亡的开销,提高性能

  (2)提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行

  (3)提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配、调优和监控。

线程池执行顺序:

线程池中包括:核心线程、非核心线程、任务队列、拒绝策略
  • 核心线程池:线程池创建的线程,一般不会超时,如果当前没有任务,核心线程池会一直等待任务被提交进来
  • 非核心线程:核心线程池满了之后,会创建非核心线程
  • 任务队列:容纳等待任务的容器
  • 拒绝策略:非核心线程满了之后,就会触发拒绝策略,拒绝任务进入任务队列
线程池执行流程:
  1. 通过execute方法提交任务;
  2. 如果线程池没有满,将提交的任务绑定线程池里的核心线程(first task);
  3. 如果线程池满了,会把任务放到任务队列里
  4. 如果队列也满了,创建非核心线程
  5. 如果非核心线程满了之后,产生拒绝策略(可以自定义,如:1.抛出异常,任务已满;2.扩充队列;)

创建线程池的方式: 

  1. ThreadPoolExcutor方法创建,是最原始的创建方法,其参数有:核心线程数、最大线程数、空闲线程等待时间、等待时间单位、任务等待队列、创建线程工厂、拒绝策略
  2. newFixThreadPool方法创建,该方法时对ThreadPoolExcuse的封装,传入一个corePoolNum核心线程数,保证随时有这个数量的线程在活跃
  3. newCachedThreadPool方法创建,该方法创建的线程是尽可能使用缓存线程处理任务,如果缓存线程不够,则进行new Thread,适合处理大量段时间任务的业务场景,缓存线程超过60s空置,就会终止并移除缓存
  4. newSingleThreadExcutor方法创建,该方法创建的线程池只有一个线程运行,而且对ThreadPoolExcuse进行了重新封装,保证了该线程池不能被修改,只能有一个线程在执行
  5. newSingleThreadScheduledExcutor方法时在newSingleThreadExcutor基础上进行封装的,也是单例线程池,可以进行单例线程池的周期性或定时使用
  6. newScheduledThreadPool方法创建的线程池,和5比起来,这个是多个线程的,也就是说可以对多个线程进行周期性或者定时的调度
  7. newWokrStealingPool方法,是基于ForkJoinPool创建线程的封装,是在jdk1.8后引入的,特点是可以让cpu很好的进行任务并行调度处理,不保证处理顺序,适合长时间处理的业务场景
当你发现自己的才华撑不起野心时,就请安静下来学习吧
原文地址:https://www.cnblogs.com/smallVampire/p/12123314.html