聊聊线程池

在开始做这期博客之前,作者提出了几个问题,文章将通过这几个问题穿插着了解线程池

  1. 线程池是什么?

  2. 为什么要用线程池?他解决了哪些问题?

  3. 有哪些默认的线程池?他们有没有什么问题?

  4. 线程池工作流程?

  5. work工作流程?

  6. 线程池的参数有哪些?生产环境该如何根据业务调整这些参数?


进入正题

1. 什么是线程池

wikipedia

计算机科学中,线程池是一种为了取得应用程序并发度的软件设计模式。它也被成为replicated workers or
work-crew model,一个线程池在其内部维护这一组为了等待执行并发任务的线程,通过对这一组线程的维护,
这种模式提高了性能并且避免了短任务频繁创建及销毁的执行延迟。

美团技术团队

线程池是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,比如MySQL。

池化思想
顾名思义,将资源统一在一起管理解决资源分配的问题,最大化收益并最小化风险。

池化思想不仅可以用在计算机领域,也可以用于人力管理、工作管理设备、金融管理(例如将RD认为是一种资源,将所有RD统一放入池子里统一管理,分配开发任务等等),其他几种使用场景包括以下:

  • 内存池(Memory Pooling) : 预先申请内存,提高内存申请速度,减少内存碎片
  • 连接池(Connection Pooling) : 预先申请连接信息,提升申请连接的速度,降低系统的开销
  • 实例池(Object Pooling) : 循环使用对象,减少资源在初始化和释放时的昂贵损耗。

2. 为什么要用线程池? 线程池有什么好处?

  • 降低资源损耗 通过池化技术重复利用已经创建的线程, 降低线程创建和销毁带来的损耗。
  • 提高响应速度 任务到达时,无需等待线程创建即可立即执行
  • 提高对线程的管理性,线程是稀缺资源,无限制的创建不仅会消耗系统的资源,并且还会因为资源分配不合理导致调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控
  • 提供更多可以调控的功能,线程池具备可拓展性,允许开发人员向其中添加更多的功能。比如延迟队列,允许任务延期执行

3.有哪些默认的线程池

在Java当中,主要通过类Executors提供的几个工厂方法来创建默认的线程池,其中JDK1.8中主要提供以下6种默认的实现

  • newSingleThreadExecutor
  • newFixedThreadPool
  • newWorkStealingPool
  • newSingleThreadScheduledExecutor
  • newScheduledThreadPool
  • newCachedThreadPool

这些工厂方法都是通过ThreadPoolExecutor实现的,只是不同的方法构造参数不尽相同

文章未完成待续….

to be continued