前言
前面我们在创建线程时,都是直接new Thread();
这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,CPU爆满等问题
幸运的是,Java里面有线程池的概念,而线程池的核心框架,就是我们今天的主题,Executor
接下来,就让我们一起畅游在Java线程池的海洋中吧
本节会用银行办业务的场景来对比介绍线程池的核心概念,这样理解起来会很轻松
小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【111】即可免费获取
简介
Executor是线程池的核心框架;
和它相对应的有一个辅助工厂类Executors,这个类提供了许多工厂方法,用来创建各种各样的线程池,下面我们先看下几种常见的线程池
// 容量固定的线程池
Executor fixedThreadPool = Executors.newFixedThreadPool(5);
// 容量动态增减的线程池
Executor cachedThreadPool = Executors.newCachedThreadPool();
// 单个线程的线程池
Executor singleThreadExecutor = Executors.newSingleThreadExecutor();
// 基于调度机制的线程池(不同于上面的线程池,这个池创建的任务不会立马执行,而是定期或者延时执行)
Executor scheduledThreadPool = Executors.newScheduledThreadPool(5);
上面这些线程池的区别主要就是线程数量的不同以及任务执行的时机
下面让我们开始吧
目录
-
线程池的底层类
ThreadPoolExecutor
-
为啥阿里不建议使用 Executors来创建线程池?
-
线程池的生命周期
ExecutorService
正文
1. 线程池的底层类 ThreadPoolExecutor
在文章开头创建的几个线程池,内部都是有调用ThreadPoolExecutor
这个类的,如下所示
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
这个类是Exexutor的一个实现类,关系图如下所示:
-
其中Executors就是上面介绍的辅助工厂类,用来创建各种线程池
-
接口ExecutorService是Executor的一个子接口,它对Executor进行了扩展,原有的Executor只能执行任务,而ExecutorService还可以管理线程池的生命周期(下面会介绍)
所以我们先来介绍下这个底层类,它的完整构造参数如下所示:
public ThreadPoolExecutor(int co