ExecutorService 详解 -- 执行器服务(线程池)

前言

ExecutorService是Java提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过ExecutorService获得线程。它可以有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞,同时提供定时执行、定期执行、单线程、并发数控制等功能,也不用使用TimerTask了。

1、线程池是为了避免服务端大量线程的创建和销毁而造成资源的浪费
2、线程池创建好之后,开始的时候里面不包含任何线程
3、在线程池创建的时候,要指定它包含的线程数量
4、当线程池中的线程没有达到指定数量的时候,那么每一个请求都会创建一个新的线程来处理
5、核心线程用完之后,不会被销毁,而是会还回线程池等待下一个请求
6、当核心线程全部被占用,那么后来的请求会被放入工作队列中
7、工作队列本质上是一个阻塞式队列
8、当工作队列也被用满,那么后来的更多请求会被线程池中创建出来的临时线程处理
9、临时线程用完之后,不会立即销毁,而是会存活指定的一段时间后才会被销毁
10、如果临时线程全部被占用,后来的线程要么被阻塞,要么交给拒绝处理器来进行拒绝

ExecutorService 的创建方法(自定义)
ExecutorService 详解 -- 执行器服务(线程池)_第1张图片核心参数
ExecutorService 详解 -- 执行器服务(线程池)_第2张图片工作流程
ExecutorService 详解 -- 执行器服务(线程池)_第3张图片
常用线程池
ExecutorService 详解 -- 执行器服务(线程池)_第4张图片

缓存线程池 – newCachedThreadPool(Java定义好的线程池)

ExecutorService es = Executors.newCachedThreadPool();

使用场景:适用于大量的短任务场景,或者大量高并发,一定不适合用于长任务场景,导致服务器承载大量的线程甚至于导致服务器的崩溃。

特点:
1、没有核心线程
2、全部都是临时线程
3、临时线程数量为Integer.MAX_VALUE
4、临时线程存活时间较短,为1分钟
5、工作队列是一个同步队列

固定线程数的线程池-- newFixedThreadPool(int threadsNum) (Java定义好的线程池)

ExecutorService es = Executors.newFixedThreadPool(20);

使用场景:大量的长任务场景,不适合短任务场景,会导致短任务的耗费时间偏长

特点:
1、需要指定核心线程数量
2、全部都是核心线程,没有临时线程
3、工作队列为阻塞式链式队列,存储无限多个任务

你可能感兴趣的:(java学习)