一位工作3年工作经验的小伙伴面试时被问到,说,Java原生API中,提供了几种实现线程池的方式?当时他只回答了一种方式。屏幕前的你,是不是也能够完整地回答出来呢?
下面我给大家分享一下我的理解。
1 线程池的主要实现方式
ENTER TITLE
JDK默认提供了五种不同的线程池的实现方式,分别是CachedThreadPool可以缓存的线程池、FiexdThreadPool固定线程数量的线程池、SingleThreadExecutor只有一个工作线程的线程池、ScheduledThreadPool可定时调度的线程池、WorkStealingPool可并行处理的线程。
这些线程池,都是通过JDK中的工具类Executors来构建的,线程池内部的最终实现类是一个叫做ThreadPoolExecutor。
2 主要特征介绍
下面我分别介绍一下每种线程池实现方式的特点:
ENTER TITLE
第1种是:CachedThreadPool,是一种可以缓存的线程池,
ENTER TITLE
它可以用来处理大量短期的突发流量。它有以下三个特点:
1)对最大线程数没有限制,也就是说可以登记线程数可以达到Integer.MAX_VALUE
2) 线程存活时间是60秒
3)阻塞队列用的是SynchronousQueue,这是一种不能存储任何元素的阻塞队列,也就是没提交一个任务,到这个队列里面都需要分配一个工作线程来处理。
因为CachedThreadPool的最大线程数没有限制,所以它可以用来处理大量的任务。另外,每个工作线程有可以存活60秒,是的这些工作线程可以缓存起来,去应对更多的任务处理
ENTER TITLE
第2种是:FiexdThreadPool,是一种固定线程数量的线程池。
ENTER TITLE
它的特点就是:核心线程和最大线程数量都是一个固定的值。如果任务比较多工作线程处理不过来的情况下,就会加入到阻塞队列里面等待执行。
ENTER TITLE
第3种是:SingleThreadExecutor只有一个工作线程的线程池,
ENTER TITLE
并且线程数量无法动态更改,因此,可以保证所有的任务都按照FIFO先进先出的方式顺序执行。
ENTER TITLE
第4种是:ScheduledThreadPool,具有延迟执行功能的线程池,
ENTER TITLE
可以用它来实现定时调度。
ENTER TITLE
第5种是:WorkStealingPool,它是Java 8里面新加入的线程池,
ENTER TITLE
它会在内部构造一个ForkJoinPool,利用工作窃取的算法并行处理请求。
好了,以上就是我对Java线程池的理解。
另外,5/6/7月份资料文档已打包,包含如下↓(还在持续更新中!):
①100道最新大厂经典面试题解析资料文档!
②20万 字Java面试题解析和配套答案!
③从应届生到高级开发都使适用的简历模板!
④从入门到精通的架构师学习路线图!