线程池简介

281 阅读2分钟

什么是线程池?

线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。

为什么使用线程池?

上面也说了线程池可以提升性能,我们在详细列举

  • 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度:当任务达到时,任务可以不需要等到线程创建,就能立即执行
  • 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一的分配,调优和监控。

线程池种类

可以看到jdk提供的线程池主要是三大类

  • ThreadPoolExecutor:普通线程池,也是我们用的最多的
  • ScheduledThreadPoolExecutor: 定时调度的线程池
  • ForkJoinPool:利用分治思想将任务拆解,放入队列,多核cpu处理不同的队列,处理完自己的队列以后,再窃取其他队列的任务,达到充分利用cpu的目的

怎么使用呢?

我们知道Doug Lea提供了一个工具类Executors,让我们简单方便的构造线程池,如下图所示:

但是方便归方便,满足业务场景和规避风险才是更重要的。所以出现了下面阿里的规范,截图为阿里华山版java开发手册:

阿里规范也是前人踩坑的血泪史,上面说使用ThreadPoolExecutor的方式构建,这样让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。所以我们后面一起看看线程池源码的实现吧。