如果本文有错误,希望指出。
在项目中,线程是一种稀缺资源,频繁的创建和销毁,对于系统的性能有着很大的消耗。线程池是线程资源复用的典范之作,通过维护一个一定数量的线程集合,在需要运行线程任务的时候直接从这个集合中取出一个线程去运行任务,而不是重新创建一个。这点在阿里Java手册上也提出了:
使用线程池可以带来一系列好处:
- 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。
- 提高响应速度:任务到达时,无需等待线程创建即可立即执行。
- 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。
- 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。
在Java中提供了几种线程池创建的方法,不过这几种方法都是最后通过 ThreadPoolExecutor
来创建线程的。在开始讲Java提供的几种之前,先讲下 ThreadPoolExecutor
中几个参数的含义。
ThreadPoolExecutor
内部工作原理
- corePoolSize :池中所保存的线程数,包括空闲线程,除非设置 allowCoreThreadTimeOut 参数,否则创建后会一直存活
- maximumPoolSize:池中允许的最大线程数
- keepAliveTime:非核心线程空闲线程等待新任务的最长时间,即线程数多余核心数的线程,会被销毁掉
- unit:keepAliveTime 参数的时间单位
- workQueue :执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务
- threadFactory:执行程序创建新线程时使用的工厂
- handler :由于超出线程范围和队列容量而使执行