在开始做这期博客之前,作者提出了几个问题,文章将通过这几个问题穿插着了解线程池
线程池是什么?
为什么要用线程池?他解决了哪些问题?
有哪些默认的线程池?他们有没有什么问题?
线程池工作流程?
work工作流程?
线程池的参数有哪些?生产环境该如何根据业务调整这些参数?
进入正题
1. 什么是线程池
计算机科学中,线程池是一种为了取得应用程序并发度的软件设计模式。它也被成为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